λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Back/Spring

[Spring/Security] JWT (JSON Web Token)

by μ—₯?은 2023. 6. 26.
λ°˜μ‘ν˜•

πŸ“Œ JWT (JSON Web Token)

βœ” JWT λž€?

JWTλŠ” λ‹Ήμ‚¬μžκ°„μ— 정보λ₯Ό JSON 객체둜 μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜κΈ° μœ„ν•œ μ»΄νŒ©νŠΈν•˜κ³  독립적인 방식을 μ •μ˜ ν•˜λŠ” κ°œλ°©ν˜• ν‘œμ€€μ΄λ‹€. 이 μ •λ³΄λŠ” λ””μ§€ν„Έ μ„œλͺ…이 λ˜μ–΄ μžˆμœΌλ―€λ‘œ ν™•μΈν•˜κ³  μ‹ λ’°ν•  수 μžˆλ‹€. JWT λŠ” λΉ„λ°€(HMAC μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš©) λ˜λŠ” RSA λ˜λŠ” ECDSAλ₯Ό μ‚¬μš©ν•˜λŠ” 곡개/κ°œμΈν‚€ 깑을 μ‚¬μš©ν•˜μ—¬ μ„œλͺ…ν•  수 μžˆλ‹€.

 

JWTλ₯Ό μ•”ν˜Έν™”ν•˜μ—¬ λ‹Ήμ‚¬μž 간에 비밀성을 μ œκ³΅ν•  μˆ˜λ„ μžˆμ§€λ§Œ μ—¬κΈ°μ„œλŠ” μ„œλͺ…λœ ν† ν°μ— 쀑점을 λ‘˜ 것이닀. μ„œλͺ…λœ 토큰은 κ·Έ μ•ˆμ— ν¬ν•¨λœ 정보, μš”κ΅¬μ‚¬ν•­ λ“±μ˜ λ¬΄κ²°μ„±μ„ ν™•인할 수 μžˆλŠ” 반면 μ•”ν˜Έν™”λœ 토큰은 λ‹€λ₯Έ λ‹Ήμ‚¬μžλ‘œλΆ€ν„° ν•΄λ‹Ή ν΄λ ˆμž„μ„ μˆ¨κΈ΄λ‹€ . κ³΅κ°œ/개인 ν‚€ μŒμ„ μ‚¬μš©ν•˜μ—¬ 토큰에 μ„œλͺ…ν•  λ•Œ μ„œλͺ…은 개인 ν‚€λ₯Ό λ³΄μœ ν•œ λ‹Ήμ‚¬μžλ§Œμ΄ μ„œλͺ…ν•œ λ‹Ήμ‚¬μžμž„μ„ μΈμ¦ν•œλ‹€.

 

βœ” JWT 의 ꡬ쑰

κ°„λ‹¨ν•œ ν˜•νƒœμ˜ JSON μ›Ή 토큰은 점( .)으둜 κ΅¬λΆ„λœ μ„Έ λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λœλ‹€.

  • 머리글
  • 유효 νƒ‘μž¬λŸ‰
  • μ„œλͺ…

λ”°λΌμ„œ JWTλŠ” 일반적으둜 λ‹€μŒκ³Ό κ°™λ‹€.

xxxxx.yyyyy.zzzzz

 

헀더 (Header)

ν—€λ”λŠ” μΌλ°˜μ μœΌλ‘œ ν† ν° μœ ν˜•(JWT)κ³Ό μ‚¬μš© 쀑인 μ„œλͺ… μ•Œκ³ λ¦¬μ¦˜(예: HMAC SHA256 λ˜λŠ” RSA)의 두 λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λœλ‹€.

{
  "alg": "HS256",
  "typ": "JWT"
}

그런 λ‹€μŒ 이 JSON은 Base64Url둜 μΈμ½”λ”©λ˜μ–΄ JWT의 첫 번째 뢀뢄을 ν˜•μ„±ν•œλ‹€.

 

 

νŽ˜μ΄λ‘œλ“œ(정보) (PayLoad)

ν† ν°μ˜ 두 번째 뢀뢄은 정보λ₯Ό ν¬ν•¨ν•˜λŠ” νŽ˜μ΄λ‘œλ“œλ‹€. ν΄λ ˆμž„은 μ—”ν„°ν‹°(일반적으둜 μ‚¬μš©μž) 및 μΆ”κ°€ 데이터에 λŒ€ν•œ μ„€λͺ…이닀. ν΄λ ˆμž„μ—λŠ” λ“±λ‘λœ ν΄λ ˆμž„ , κ³΅κ°œ ν΄λ ˆμž„ λ° λΉ„κ³΅κ°œ ν΄λ ˆμž„ μ˜ μ„Έ κ°€μ§€ μœ ν˜•μ΄ μžˆλ‹€ .

 

νŽ˜μ΄λ‘œλ“œμ˜ μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

그런 λ‹€μŒ νŽ˜μ΄λ‘œλ“œλŠ” Base64Url둜 μΈμ½”λ”©λ˜μ–΄ JSON μ›Ή ν† ν°μ˜ 두 번째 뢀뢄을 ν˜•μ„±ν•œλ‹€.

 

 

μ„œλͺ… (Signiture)

μ„œλͺ… 뢀뢄을 μƒμ„±ν•˜λ €λ©΄ μΈμ½”λ”©λœ 헀더, μΈμ½”λ”©λœ νŽ˜μ΄λ‘œλ“œ, λΉ„λ°€, 헀더에 μ§€μ •λœ μ•Œκ³ λ¦¬μ¦˜μ„ κ°€μ Έμ™€μ„œ μ„œλͺ…ν•΄μ•Ό ν•œλ‹€.

예λ₯Ό λ“€μ–΄ HMAC SHA256 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ €λŠ” 경우 μ„œλͺ…은 λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ μƒμ„±λœλ‹€.

 

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

μ„œλͺ…은 도쀑에 λ©”μ‹œμ§€κ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 데 μ‚¬μš©λ˜λ©° 개인 ν‚€λ‘œ μ„œλͺ…λœ ν† ν°μ˜ 경우 JWT λ°œμ‹ μžκ°€ λˆ„κ΅¬μΈμ§€ 확인할 μˆ˜λ„ μžˆλ‹€.

 

 

 

 

 

 

μ°Έκ³   https://jwt.io/introduction

λ°˜μ‘ν˜•