๐ค JSON Web Token์ด ๋ฌด์์ธ๊ฐ?
- JWT๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ (์๋น์ค์ ์๋น์ค ์ฌ์ด) ํต์ ์ ๊ถํ ์ธ๊ฐ๋ฅผ ์ํด ์ฌ์ฉํ๋ ํ ํฐ์ด๋ค.
- JWT๋ ์นํ์ค RFC 7519์ผ๋ก์ ๋ ๊ฐ์ฒด์์ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ๊ณ ์๊ฐ์์ฉ์ ์ธ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ๋ฌํด์ค๋ค.
- JWT๋ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๊ณ ์๋ค.
- ์ค๊ฐ์ ์ฝ๊ฒ ํ์ทจํ์ฌ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ด์ง ์๋ ๊ฒ์ด ์ข๋ค.
- ์๋ฒ์์๋ ๋น๋ฐํค๋ก ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ(๋ณ์กฐ ์ ๋ฌด)๋ง์ ๊ฒ์ฌํ๋ค.
- JWT๋ ํ ๊ทผ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋ฐฉ๋ฒ์ค ํ๋์ด๋ค.
JWT๋ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋ฐฉ๋ฒ ์ค ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. ๊ฐ๋จํ๊ฒ ํ ํฐ ๊ธฐ๋ฐ๊ณผ ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ(์ธ์ )์ ์ฐจ์ด์ ์ ์์๋ณด๊ณ ์ํ๋ค.
๐ค ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ?

์ถ์ฒ : https://velopert.com/2350
- ๊ฐ๋จํ ๋งํด์ ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ์ "์ธ์
"๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฏธํ๋ค.
- ์๋ฒ์ธก์์ ์ฌ์ฉ์๋ค์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ ์์ด์ผ ํ๋ค.
- ์ฌ์ฉ์๋ค์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํด์ ์ธ์ ์ ์ด์ฉํ๋ค.
- ์ด๋ฌํ ๋ฐฉ์์ stateful ํ๋ค๊ณ ํ๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ๋์, ์ํ ์ ๋ณด๋ฑ์ ์ ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ธ์ ์ํ์ ๊ธฐ๋ฐํ์ฌ ์๋ฒ์ ์๋ต์ด ๋ฌ๋ฆฌ์ง๋ค.
- ๋จ์
- ์ธ์
- ์ธ์ ์ ๋ณดํต ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ฅผ ์ ์ฅํ๋๋ฐ, ์ด์ฉ์ ์๊ฐ ๋ง์์ง๋ฉด ๋จ ๋์ DB๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ ์๋ฒ ์ฑ๋ฅ์ ๋ฌด๋ฆฌ๋ฅผ ์ค ์ ์๋ค.
- ๋ถ์ฐ ์๋ฒ ์์คํ
๋นํจ์จ์
- ํธ๋ํฝ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ถ์ฐ ์๋ฒ๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด ์ธ์ ์ผ๋ก๋ ๋ถ์ฐ ์์คํ ์ ๋ง๋ค๊ธฐ ๋งค์ฐ ๋ณต์กํ๋ค.
- CORS (Cross - Origin Resource Sharing)
- ์ธ์ ์ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ๋๋ ์ฟ ํค๋ ๋จ์ผ ๋๋ฉ์ธ ๋ฐ ์๋ธ ๋๋ฉ์ธ์์๋ง ์๋ํ๋๋ก ์ค๊ณ๋์ด์๋ค. ๋ฐ๋ผ์ ์ฟ ํค๋ฅผ ์ฌ๋ฌ ๋๋ฉ์ธ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๋ค.
- ์ธ์
์ข์ ๋ธ๋ก๊ทธ ๋ด์ฉ: https://sanghaklee.tistory.com/47
๐ค ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ?

์ถ์ฒ : https://velopert.com/2350
- ์ธ์ฆ๋ฐ์ ์ฌ์ฉ์๋ค์๊ฒ ํ ํฐ์ ๋ฐ๊ธํ๊ณ , ์๋ฒ์ ์์ฒญ์ ํ ๋ ํค๋์ ํ ํฐ์ ํจ๊ป ๋ณด๋ด๋๋ก ํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋ค.
- ์ ์ ๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ ํ๋ค.
- ์๋ฒ์ธก์์ ํด๋น ๊ณ์ ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๋ค.
- ๊ณ์ ์ ๋ณด๊ฐ ์ ํํ๋ค๋ฉด, ์๋ฒ์ธก์์ ์ ์ ์๊ฒ signedํ ํฐ์ ๋ฐ๊ธํด์ค๋ค.
- ์ฌ๊ธฐ์ signed์ ์๋ฏธ๋ ํด๋น ํ ํฐ์ด ์๋ฒ์์ ์ ์์ ์ผ๋ก ๋ฐ๊ธ๋ ํ ํฐ์์ ์ฆ๋ช ํ๋ signature๋ฅผ ์ง๋๊ณ ์๋ค๋ ๊ฒ.
- ํด๋ผ์ด์ธํธ ์ธก์์ ์ ๋ฌ๋ฐ์ ํ ํฐ์ ์ ์ฅํด๋๊ณ , ์๋ฒ์ ์์ฒญ์ ํ ๋๋ง๋ค, ํด๋น ํ ํฐ์ ํจ๊ป ์๋ฒ์ ์ ๋ฌํ๋ค.
- ์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ๊ณ , ์์ฒญ์ ์๋ตํ๋ค.
์ค์ํ ์ ์ ํ ํฐ์ ์ ๋ณด๋ ์ฝ๊ฒ ํ์ทจํ์ฌ ๋ณผ ์ ์์ง๋ง, ๋ณ์กฐ๋ฅผ ํ๊ฒ ๋๋ฉด ์ธ์ฆ์ด ์๋๋ค๋ ๊ฒ์ด๋ค. (๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ)
- ๋ฌด์ํ (stateless)์ด๋ฉฐ ํ์ฅ์ฑ (scalability)์ด ์๋ค.
- ํ ํฐ์ ํด๋ผ์ด์ธํธ์ฌ์ด๋์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ stateless
- ์๋ฒ๋ฅผ ํ์ฅํ์ฌ ์ด๋ค ์๋ฒ์ ์์ฒญ์ ํด๋ ๊ฐ์ ์๊ด์๋ค. scalability
- ๋ณด์์ฑ
- ์ฟ ํค์ ๋ณด์๋ฌธ์ ๋ฅผ ํด๊ฒฐ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ํ ํฐ์ ๋ณด์์ฑ๋ ๋ฌธ์ ๊ฐ ์๋ค.
- Extensibility (ํ์ฅ์ฑ)
- ํ ํฐ์ ์ด์ฉํด ๋ค๋ฅธ ์๋น์ค์์๋ ๊ถํ์ ๊ณต์ ํ ์ ์๋ค. (facebook, github...)
- ์ฌ๋ฌ ํ๋ซํผ ๋ฐ ๋๋ฉ์ธ
- ํ ํฐ์ CORS๋ฅผ ๋ง์กฑํ๋ค. ํค๋์ ๊ฐ์ ํตํด์ ํ ํฐ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋๋ฐ์ด์ค๋ฅผ ํธํํ๋ค.
HEADER.PAYLOAD.SIGNATUREJWT๋ ์ ์ ๊ธฐ์ค์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋๋ค.
- ํค๋ (Header)
- ํ์ด๋ก๋ (Payload)
- ์๋ช (Signature)
JWT๋ฅผ ๊ฒ์ฆํ๋๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง JSON๊ฐ์ฒด๋ Base64 URL-Safe ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ด๋ค.
ํค๋๋ JWT๋ฅผ ์ด๋ป๊ฒ ๊ฒ์ฆ(Verify)ํ๋๊ฐ์ ๋ํ ๋ด์ฉ์ ๋ด๊ณ ์๋ค.
{
"alg" : "HS256",
"typ" : "JWT"
}- alg - ์๋ช
์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ.
- ์ด ์๊ณ ๋ฆฌ์ฆ์ ํ ํฐ์ ๊ฒ์ฆํ ๋ ์ฌ์ฉ๋๋ signature ๋ถ๋ถ์์ ์ฌ์ฉ๋๋ค.
- typ - ํ ํฐ์ ํ์ ์ ์ง์ .
Base64๋ก ์ํธํ๋์ด์์ด, ๋๊ตฌ๋ ํ์ทจํ๋ฉด ๋ณตํธํํ์ฌ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค. ์ฆ, ์ค์ ๋ด์ฉ์ ๋ฃ์ผ๋ฉด ์๋๋ค.
Payload๋ JWT์ ๋ด์ฉ์ ๋ด๊ณ ์๋ค.
Payload์ ๋ด๋ ์ ๋ณด์ ํ ๋จ์๋ฅผ ํด๋ ์ (Claim)์ด๋ผ ํ๋ฉฐ, name / value ํํ๋ก ๋์ด ์๋ค.
Payload์ ์๋ ์์ฑ๋ค์ **ํด๋ ์ ์ (Claim Set)**์ด๋ผ ๋ถ๋ฅธ๋ค.
{
"uid" : "19234",
"userName" : "binghe"
}- Claim์ ์ข
๋ฅ
- ๋ฑ๋ก๋ (registered) ํด๋ ์ - ์ด๋ฏธ ์์ฝ๋ Claim
<iss>: ํ ํฐ ๋ฐํ์ (Issur)<sub>: ํ ๋ฅธ ์ ๋ชฉ (Subject)<aud>: ํ ํฐ ๋์์ (Audience)<exp>: ํ ํฐ ๋ง๋ฃ์๊ฐ. (Expiration Time)<nbf>: ํ ํฐ์ด ํ์ฑ๋๋ ์๊ฐ. (์ด ์๊ฐ ์ดํ์ ํ ํฐ์ ์ฌ์ฉํ ์ ์๋ค)<jti>: JWT์ ๊ณ ์ ์๋ณ์. (๋ค๋ฅธ JWT์ ๋ค๋ฅธ Uniqueํ ๊ฐ์ ์ง๋ ์ผ ํ๋ค)
- ๊ณต๊ฐ (public) ํด๋ ์ - ์ฌ์ฉ์ ์ ์ Claim
- JWT๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ํด ์ ์๋๋ Claim
- ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํด URI ํฌ๋งท์ ์ด์ฉํด ์ ์ฅํ๋ค.
- ๋น๊ณต๊ฐ (private) ํด๋ ์ - ์ฌ์ฉ์ ์ ์ Claim
- JWT ์ฌ์ฉ์์ ์์ฐ์ ์ํธ ํฉ์ ํ์ ์ ํด์ง๋ Claim
- ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. (์ด๋ฆ์ ์ถฉ๋ ์ํ์ด ์๋ค.)
- ๋ฑ๋ก๋ (registered) ํด๋ ์ - ์ด๋ฏธ ์์ฝ๋ Claim
Base64๋ก ์ํธํ๋์ด์์ด, ๋๊ตฌ๋ ํ์ทจํ๋ฉด ๋ณตํธํํ์ฌ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค. ์ฆ, ์ค์ ๋ด์ฉ์ ๋ฃ์ผ๋ฉด ์๋๋ค.
์ ์ ๊ตฌ๋ถ์๋ก ํด์ Header์ Payload๋ฅผ ํฉ์น ๋ฌธ์์ด์ ์๋ช ํ ๊ฐ์ด๋ค.
// ์์ฑ ๋ฐฉ์
HSACSHA256 (
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
- Signature์ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ(๋ณ์กฐ์ ๋ฌด)๋ฅผ ์
์ฆํ๋๋ฐ ์ฌ์ฉ๋๋ค.
- ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ์ ํ์ทจ๋์ด, Header๋ Payload๊ฐ ๋ณ์กฐ๋์๋ค๋ฉด Signature ๊ฒ์ฆ์ ํตํด ์์๋ผ ์ ์๋ค.
JWT์ Signature ๋ถ๋ถ์ message(header + payload)๊ฐ ๋ณ์กฐ๋์๋์ง ๊ฒ์ฌํ๋ ์ญํ ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ํธํํ๊ณ ๊ฒ์ฆํ๋ ๋ฐฉ์์ ๋ ๊ฐ์ง์ด๋ค.
RS256: RSA Signature with SHA-256
๋น๋์นญํค์ ๋ํ ๊ฐ๋ ์ ์ฌ๊ธฐ์์ ํ์ธ๊ฐ๋ฅํฉ๋๋ค :)
- ๋น๋์นญํค ๋ฐฉ์
- message์ SHA256 ์ ์ฉํ, private key ์ฌ์ฉํด์ ์ํธํํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก public key๋ JWT๋ฅผ ๋ฐ๊ธํ ์๋ฒ์์ JWK (Json Web Key)์ ์ ์๋ ๋ฐฉ์์ ํตํด ๊ณต๊ฐ์ ์ผ๋ก ์ ๊ณต๋๋ค.
HS256: HMAC with SHA-256
๋์นญํค์ ๋ํ ๊ฐ๋ ์ ์ฌ๊ธฐ์์ ํ์ธ๊ฐ๋ฅํฉ๋๋ค :)
- ๋ก๊ทธ์ธ ์์ฒญ์ ๋ฐ๊ณ ์ธ์ฆ์ด ๋์๋ค๋ฉด Header(Base64url)์ Payload(Base64Url) ๋ด์ฉ์ผ๋ก secret key์ ํจ๊ป Signature๋ฅผ ์์ฑํ๋ค.
- ์ฆ, Header์ Payload์ SHA256 ์ ์ฉ ํ ๋์นญํค(secret key) ์ฌ์ฉํด์ ์ํธํ
- ํด๋น ๋์นญํค๋ฅผ ๊ฐ์ง ์ฃผ์ฒด๋ค์ ๋ชจ๋ Signature ์ ํจ์ฑ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๋ค.
๋ ์ ํํ ์๋ฆฌ๋ JWT ๊ณต์ ํํ์ด์ง์์ ํ์ธ๊ฐ๋ฅํ๋ค.
JWT (JSON Web Token) : JWS or JWE
JWS (JSON Web Signature) : ์๋ฒ์์ ์ธ์ฆ์ ํ๊ณ ์ธ์ฆ ์ ๋ณด์ private key (secret key)๋ก ์๋ช ํ Token. (String => header.payload.signature)
JWE (JSON Web Encryption) : ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ Token ํ ํ๊ฒ.
JWK (JSON Web Key) : JWE ์์ payload encryption ์ ์ฐ์ธ ํค๋ฅผ token ํ ํ๊ฒ. (๋ฌผ๋ก , ํค ์์ฒด๋ ์ํธํ๋์ด ์์ฃ .)
JWS๋ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
String jws = Jwts.builder()
.setSubject("binghe")
.signWith(key)
.compact();Jwts.builder()๋ฉ์๋๋ฅผ ์ด์ฉํดJwtBuilder์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.JwtBuilder๋ฉ์๋ ์ฒด์ด๋์ ํตํด ํค๋์ ํ์ด๋ก๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ๋ค.- JWT๋ฅผ ๊ฒ์ฆํ ๋ ์ฌ์ฉํ
SecretKeyํน์ ๋น๋์นญ์ฑ์PrivateKey๋ฅผ ์ค์ ํด์ค๋ค. compact()๋ฉ์๋๋ฅผ ํธ์ถํ๋ฏ๋ก์จjws๋ฅผ ์์ฑํ๋ค.
์ฝ๊ฒ ์๊ธฐํ๋ฉด ๋น๋ ํจํด์ผ๋ก ๋ฉ์๋ ์ฒด์ด๋์ ํตํด ๊ฐ๊ฐ์ ์ค์ ์ ํด์ฃผ๊ณ ๋ง๋ ๋ค๋ ๊ฒ.
header parameter
String jws = Jwts.builder()
.setHeaderParam("kid", "binghe")
// ....- ์ค์ ํด์ฃผ๊ณ ์ถ์ ํค๋๋ฅผ
setHeaderParam์ ํตํด ์ค์ ํด์ค ์ ์๋ค. (key - value)- ์ฌ๋ฌ๋ฒ ํธ์ถํด๋ ๋ด๋ถ์
Header์ธ์คํด์ค์append๋๋ค. - ๋ง์ฝ ๋์ผํ
key๋ฅผ ์ธํ ํด์ฃผ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง ๊ฒ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ๋๋ค.
- ์ฌ๋ฌ๋ฒ ํธ์ถํด๋ ๋ด๋ถ์
alg๋zipํค๋๋ฅผ ์ค์ ํด์ฃผ์ง ์์๋ ์๋์ ์ผ๋ก ์ค์ ํด์ค๋ค.
Header ์ธ์คํด์ค
Header header = Jwts.header(); // Map<String, Object>์ ๊ตฌํ์ฒด
header.put(key, value);
...
String jws = Jwts.builder()
.setHeader(header)
// ...setHeader๋ฅผ ํธ์ถํ๋ฉด ์ด๋ฏธ ์ค์ ๋์ด์์ ์ ์๋ ๋ชจ๋ ๋์ผํ ํค๋ key-value ์์ ๋ฎ์ด์ด๋ค.- ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ JJWT๋ ์ง์ ๋ ํค๋ ๊ฐ์ฒด์ ์๋ ์๋ ์๊ด์์ด ๋ชจ๋
alg์zipํค๋๋ฅผ ์ค์ ํด์ค๋ค.
Header Map
Map<String, Object> header = new Map<String, Object>();
header.set(key, value);
...
String jws = Jwts.builder()
.setHeader(header)
// ...- Header ์ธ์คํด์ค์ ๋์ผํ๋ค.
Claims๋ JWT์ ๋ณธ๋ฌธ์ด๋ฉฐ, JWT ์์ฑ์๊ฐ JWT ์๋ น์ธ์๊ฒ ์ ์ํ๊ณ ์ ํ๋ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๋ค.
Standard Claims
String jws = Jwts.builder()
.setIssuer("me")
.setSubject("Bob")
.setAudience("you")
.setExpiration(expiration) //a java.util.Date
.setNotBefore(notBefore) //a java.util.Date
.setIssuedAt(new Date()) // for example, now
.setId(UUID.randomUUID()) //just an example id
/// ... etc ...Custom Claims ํ์ค Claims๋ง๊ณ ์ฌ์ฉ์ ์ง์ ํด๋ ์์ ์ค์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋๋ค.
String jws = Jwts.builder()
.claim("hello", "World")
.claim("name", "binghe")
// ....claim์ด ํธ์ถ๋ ๋๋ง๋ค key-value ์์ ๋ด๋ถ Claim ์ธ์คํด์ค์ ์ถ๊ฐํ๋ค.- ๋ง์ฝ ๋์ผํ ๊ธฐ์กด key-value๊ฐ ์๋ค๋ฉด ๋ฎ์ด์ด๋ค.
- ํ์ค claim์ ๊ฐ๋ ์ฑ ํฅ์์ ์ํด ํ์ค setter ๋ฐฉ์์ด ๋ ์ข๋ค๊ณ ํ๋ค.
Claim ์ธ์คํด์ค ๋ชจ๋ Claim์ ํ ๋ฒ์ ์ง์ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
Claims claims = Jwts.claims(); // Map<String, Object>์ ๊ตฌํ์ฒด
claims.put(key, value);
String jws = Jwts.builder()
.setClaims(claims)
// ...setClaims๋ฅผ ํธ์ถํ๋ฉด ์ด๋ฏธ ์ค์ ๋์ด์์ ์ ์๋ ๋ชจ๋ ๋์ผํ Claim key-value ์์ ๋ฎ์ด์ด๋ค.
Claims Map
Map<String, Object> claims = new Map<String, Object>();
claims.set(key, value);
...
String jws = Jwts.builder()
.setClaims(header)
// ...- Claims ์ธ์คํด์ค์ ๋์ผํ๋ค.
JWS์ ์ฝ๊ธฐ(ํ์ฑ)์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ด๋ค์ง๋ค.
Jwts.parserBuilder()์ ์ฌ์ฉํ์ฌJwtParserBuilder` ์ธ์คํด์ค๋ฅผ ๋ง๋ ๋ค.- JWS ์๋ช
์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ
secret key๋๋๋น๋์นญ public key๋ฅผ ์ง์ ํ๋ค. - ์ค๋ ๋ ์์ ํ
JwtParser๋ฅผ ๋ฐํ๋ฐ์ผ๋ ค๋ฉดJwtParserBuilder์build()๋ฅผ ํธ์ถํด์ผํ๋ค. - ๋ง์ง๋ง์ผ๋ก jws (
String)์ ๋งค๊ฐ๋ณ์๋กparseClaimsJws(String)์ ํธ์ถํ๋ฉด ์๋์ JWS๋ฅผ ์์ฑํ๋ค. - ์ ์ฒด ์ฝ๋๋ ๊ตฌ๋ฌธ ๋ถ์ ๋๋ ์๋ช
๊ฒ์ฆ์ด ์คํจํ ๊ฒฝ์ฐ๋ฅผ ์ํด
try/catch๋ก ๊ฐ์ธ์ผํ๋ค.
Jws<Claims> jws;
try {
jws = Jwts.parserBuilder() // (1)
.setSigningKey(key) // (2)
.build() // (3)
.parseClaimsJws(jwsString); // (4)
// we can safely trust the JWT
catch (JwtException ex) { // (5)
// we *cannot* use the JWT as intended by its creator
}๋ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
