Spring/Spring Security

[Spring Security] JWT Token

λΉ…μ½œνŒ 2023. 5. 20. 17:13
728x90
λ°˜μ‘ν˜•

 πŸ” JWT : Json Web Token


JWTλŠ” μ„Έ λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λœλ‹€ : 헀더(Header), νŽ˜μ΄λ‘œλ“œ(Payload), μ„œλͺ…(Signature).

 

https://dzone.com/articles/cookies-vs-tokens-the-definitive-guide

 

  1. 헀더 (Header): ν† ν°μ˜ μœ ν˜• (즉, JWT)κ³Ό ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜ (예: HMAC SHA256 λ˜λŠ” RSA)을 μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
  2. νŽ˜μ΄λ‘œλ“œ (Payload): νŽ˜μ΄λ‘œλ“œλŠ” ν΄λ ˆμž„μ„ ν¬ν•¨ν•˜κ³  있으며, μ΄λŠ” μ—”ν‹°ν‹° (일반적으둜 μ‚¬μš©μž)와 μΆ”κ°€ 데이터에 λŒ€ν•œ μ„ μ–ΈμœΌλ‘œ ν΄λ ˆμž„μ—λŠ” λ“±λ‘λœ (즉, ν‘œμ€€μ— μ •μ˜λœ), 곡개, λΉ„κ³΅κ°œ ν΄λ ˆμž„μ΄ μžˆλ‹€.
  3. μ„œλͺ… (Signature): 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό ν•©μΉœ ν›„, λΉ„λ°€ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ 이λ₯Ό μ•”ν˜Έν™”ν•œλ‹€. 이 μ„œλͺ…은 토큰이 λ³€μ‘°λ˜μ§€ μ•Šμ•˜μŒμ„ ν™•μΈν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, λΉ„λ°€ ν‚€λ₯Ό μ•Œκ³  μžˆλŠ” κ²½μš°μ—λ§Œ 토큰을 ν™•μΈν•˜κ±°λ‚˜ 생성할 수 μžˆλ‹€.

이 μ„Έ 뢀뢄은 점 ('.')으둜 κ΅¬λΆ„λ˜μ–΄ ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ μ—°κ²°λœλ‹€. JWT의 κ°€μž₯ 큰 μž₯점 쀑 ν•˜λ‚˜λŠ” 정보가 ν•΄λ‹Ή 토큰 μžμ²΄μ— ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ—, λ³„λ„μ˜ 인증 μ €μž₯μ†Œκ°€ ν•„μš” μ—†λ‹€λŠ” 것이닀. μ΄λŠ” μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”(stateless) 인증 λ©”μ»€λ‹ˆμ¦˜μ΄ κ°€λŠ₯ν•˜κ²Œ ν•˜μ—¬ μ„œλ²„μ˜ ν™•μž₯성을 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ JWTλŠ” 토큰이 νƒˆμ·¨λ˜λ©΄ κ³΅κ²©μžκ°€ κ·Έ 토큰을 μ‚¬μš©ν•΄ μ‹œμŠ€ν…œμ— μ ‘κ·Όν•  수 μžˆμœΌλ―€λ‘œ λ³΄μ•ˆμ— μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.
 
 

πŸ„ JWT 토큰을 μ™œ μ‚¬μš© ν• κΉŒ


μ„Έμ…˜ 방식 둜그인

둜그인 μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ μ‚¬μš©μž 정보λ₯Ό 확인 ν›„ μ„œλ²„μ— μ„Έμ…˜μ„ λ§Œλ“€μ–΄ μ‚¬μš©μž 정보λ₯Ό DBλ“± μ„œλ²„μ— μ €μž₯ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈμ— μ„Έμ…˜μ„ λ°˜ν™˜ν•΄ μ„Έμ…˜μ„ μ΄μš©ν•΄ 둜그인 ν›„ κ°€λŠ₯ν•œ μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.
 

μ΄λŸ¬ν•œ μ„Έμ…˜μ„ μ΄μš©ν–ˆμ„ λ•Œμ˜ λ¬Έμ œμ μ€

1. μ„œλ²„ μžμ›μ˜ κ³Όλ„ν•œ μ‚¬μš© 
    - μ„Έμ…˜μ€ μ„œλ²„μ— 데이터λ₯Ό μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— λ§Žμ€ μ‚¬μš©μžκ°€ λ™μ‹œμ— μ„œλ²„μ— μ ‘μ†ν•˜κ²Œ 되면 μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό μ¦κ°€μ‹œν‚€κ³  μ„±λŠ₯을     μ €ν•˜μ‹œν‚¬ 수 μžˆλ‹€.

 

2. ν™•μž₯μ„± μ œν•œ
    - λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό ν†΅ν•œ 닀쀑 μ„œλ²„λ₯Ό 가지고 μžˆμ„ λ•Œ μ„œλ²„λ“€ κ°„μ˜ μ„Έμ…˜μ΄ κ³΅μœ λ˜μ§€ λͺ»ν•˜μ—¬ μ„Έμ…˜ 뢈일치 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
    - μ„Έμ…˜ 뢈일치 문제 ν•΄κ²°λ°©μ•ˆ [https://hudi.blog/session-consistency-issue/]

    μ‚¬μš©μž 이동성 μ œν•œ
    - κΈ°κΈ°λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ λΈŒλΌμš°μ €λ₯Ό λ°”κΎΈλ©΄ 이전에 λ‘œκ·ΈμΈν•œ μ„Έμ…˜ 정보λ₯Ό μ΄μš©ν•  수 μ—†κ²Œ λœλ‹€.

 

jwtλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹œν¬λ¦Ών‚€λ§Œ 가지고 있으면 λ˜λ―€λ‘œ μ„œλ²„κ°€ μ—¬λŸ¬λŒ€ μ‘΄μž¬ν•΄λ„ λ¬Έμ œκ°€ μ—†λ‹€.
 
 

🌚 JWT Token μ‚¬μš© μ‹œ μ£Όμ˜ν•΄μ•Όν•  점


  1. 토큰 크기
    • JWTλŠ” μ„Έμ…˜κ³Ό λΉ„ꡐ할 λ•Œ μƒλŒ€μ μœΌλ‘œ 크기가 컀 λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ— 뢀담을 쀄 수 μžˆλ‹€.
  2. μ„œλ²„ μΈ‘μ—μ„œμ˜ μ„Έμ…˜ 관리 λΆˆκ°€
    • 일반적으둜 JWTλŠ” μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”(stateless) νŠΉμ„±μ„ 가지기 λ•Œλ¬Έμ— μ΄λŠ” μ„œλ²„ μΈ‘μ—μ„œ κ°œλ³„ JWTλ₯Ό λ¬΄νš¨ν™”ν•˜κ±°λ‚˜ λ§Œλ£Œμ‹œν‚€λŠ” 것이 μ–΄λ ΅λ‹€.
    • 토큰이 νƒˆμ·¨λ‹Ήν•˜κ±°λ‚˜ μ‹€μˆ˜λ‘œ λ…ΈμΆœλ˜λ©΄, κ·Έ 토큰은 μœ νš¨κΈ°κ°„μ΄ 만료될 λ•ŒκΉŒμ§€ μœ νš¨ν•˜κ²Œ λœλ‹€.
  3. λ³΄μ•ˆ 문제
    • 토큰이 νƒˆμ·¨λ˜λ©΄, κ³΅κ²©μžλŠ” κ·Έ 토큰을 μ‚¬μš©ν•΄ μ‹œμŠ€ν…œμ— μ ‘κ·Όν•  수 μžˆλ‹€.
  4. JWTλŠ” 정보λ₯Ό μˆ¨κΈ°μ§€ μ•ŠλŠ”λ‹€
    • JWT의 νŽ˜μ΄λ‘œλ“œλŠ” Base64둜 μΈμ½”λ”©λ˜μ–΄ μžˆμ–΄ μ‰½κ²Œ 디코딩될 수 있기 λ•Œλ¬Έμ— μ€‘μš”ν•œ κ°œμΈμ •λ³΄λ‚˜ λ―Όκ°ν•œ λ°μ΄ν„°λŠ” JWT에 ν¬ν•¨ν•΄μ„œλŠ” μ•ˆ λœλ‹€.

 

πŸ†š JWT Token VS μ„Έμ…˜


JWTλ₯Ό μ‚¬μš©ν•˜λŠ” 경우

  1. λΆ„μ‚° μ‹œμŠ€ν…œ
    • μ—¬λŸ¬ μ„œλΉ„μŠ€κ°€ μ‚¬μš©μžμ˜ 인증 μƒνƒœλ₯Ό κ³΅μœ ν•΄μ•Ό ν•˜λŠ” λΆ„μ‚° μ‹œμŠ€ν…œμ˜ 경우 JWTκ°€ μœ μš©ν•˜λ‹€.
    • JWTλŠ” μ‚¬μš©μž 정보λ₯Ό λ‚΄μž₯ν•˜λ―€λ‘œ μ„œλΉ„μŠ€ 간에 μ‰½κ²Œ 전달할 수 μžˆλ‹€.
  2. μŠ€μΌ€μΌλ§κ³Ό μ„±λŠ₯
    • μ„Έμ…˜μ€ 일반적으둜 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λ―€λ‘œ, μ‚¬μš©μž μˆ˜κ°€ μ¦κ°€ν•˜λ©΄ μ„œλ²„ λΆ€ν•˜λ₯Ό 늘릴 수 μžˆλ‹€.
    • λ°˜λ©΄μ—, JWTλŠ” ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ λ³΄κ΄€λ˜λ―€λ‘œ 이 문제λ₯Ό μ™„ν™”ν•˜λŠ”λ° 도움이 λœλ‹€.
  3. λͺ¨λ°”일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
    • 일뢀 λͺ¨λ°”일 ν”Œλž«νΌμ—μ„œλŠ” μΏ ν‚€λ₯Ό μ§€μ›ν•˜μ§€ μ•Šκ±°λ‚˜ μ œν•œμ μœΌλ‘œ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— JWTκ°€ 더 적합할 수 μžˆλ‹€.

 

μ„Έμ…˜μ„ μ‚¬μš©ν•˜λŠ” 경우

  1. μž‘μ€ 규λͺ¨μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜: μ‚¬μš©μž μˆ˜κ°€ λ§Žμ§€ μ•Šμ€ 경우, μ„Έμ…˜ 기반 인증이 더 κ°„λ‹¨ν•˜κ³  직관적일 수 μžˆλ‹€. μ„Έμ…˜μ€ μ‚¬μš©μžλ§ˆλ‹€ μ„œλ²„μ— μœ μΌν•œ IDλ₯Ό μ €μž₯ν•˜λ©°, 이 IDλ₯Ό μ‚¬μš©ν•΄ μ‚¬μš©μž 정보에 μ ‘κ·Όν•œλ‹€.
  2. μ„Έλ°€ν•œ μ ‘κ·Ό μ œμ–΄: μ„Έμ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ„œλ²„ μΈ‘μ—μ„œ μ‚¬μš©μžμ˜ 인증 μƒνƒœλ₯Ό 더 잘 μ œμ–΄ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‘œκ·Έμ•„μ›ƒ μ‹œμ μ— μ‚¬μš©μž μ„Έμ…˜μ„ λ¬΄νš¨ν™”ν•  수 있으며, μ΄λŠ” JWTμ—μ„œλŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.
  3. λ³΄μ•ˆ: JWTλŠ” λ³΄μ•ˆμƒμ˜ 이슈λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 특히, JWTλŠ” 토큰이 νƒˆμ·¨λ˜λ©΄ κ·Έ ν† ν°μ˜ μœ νš¨κΈ°κ°„μ΄ 만료될 λ•ŒκΉŒμ§€ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” λ¬Έμ œκ°€ μžˆμ–΄ μ„Έμ…˜μ„ μ΄μš©ν•˜λŠ” 것이 더 μ•ˆμ „ν•  수 μžˆλ‹€.

 

 

TODO. Spring Security JWT Token μ μš©ν•˜κΈ°

 
 

πŸ§‘‍🏫 reference

https://jwt.io/

728x90
λ°˜μ‘ν˜•