Post

πŸͺ™ JWT κ°œλ…

πŸͺ™ JWT κ°œλ…

JWTλž€?

  • JWT(Json Web Token)은  κ°„κ²°ν•˜κ³ λ„ λ…λ¦½λœ λ°©μ‹μœΌλ‘œΒ μ–‘ 단 μ‚¬μ΄μ˜ 정보λ₯Ό 전솑할 수 μžˆλ„λ‘ μ •μ˜λœ RFC 7519 μ›Ή ν‘œμ€€μ΄λ‹€.
  • μ „μ†‘λœ μ •λ³΄λŠ” λ””μ§€ν„Έ μ„œλͺ…을 톡해 κ²€μ¦λ˜λ―€λ‘œ μ‹ λ’°ν•  수 μžˆλ‹€.
  • λ‹€μŒ 두 κ°€μ§€ λ°©μ‹μœΌλ‘œ λ””μ§€ν„Έ μ„œλͺ…을 ν•  수 μžˆλ‹€.

βœ… RSA λ˜λŠ” ECDSA μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 곡개/λΉ„κ³΅κ°œ ν‚€ 쌍으둜 μ„œλͺ…

  • μ„œλͺ…λœ ν΄λ ˆμž„μ΄ μœ„μ‘° Β· λ³€μ‘° λ˜μ§€ μ•Šμ•˜λŠ”μ§€ 검증할 수 μžˆλ‹€.
  • μ„œλͺ…을 μƒμ„±ν•œ μͺ½μ΄ ν•΄λ‹Ή λΉ„κ³΅κ°œ ν‚€λ₯Ό μ†Œμœ ν•˜κ³  μžˆμŒμ„ 증λͺ…ν•  수 μžˆλ‹€.

βœ… HMAC μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 λΉ„λ°€ν‚€λ‘œ μ„œλͺ…

  • ν† ν°μ˜ 무결성을 검증할 수 μžˆλ‹€.
  • 같은 λΉ„λ°€ν‚€λ₯Ό κ°€μ§„ 주체만 μœ νš¨ν•œ μ„œλͺ…을 생성할 수 μžˆλ‹€.
  • ν΄λ ˆμž„ λ‚΄μš©μ€ μ•”ν˜Έν™”λ˜μ§€ μ•Šκ³  λˆ„κ΅¬λ‚˜ λ³Ό 수 μžˆλ‹€.

JWT λ„μž… κ·Όκ±°

  • HTTP의 μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜λŠ” Statelessλ₯Ό μ§€ν–₯ν•œλ‹€λŠ” 점이닀.
  • Statelessλž€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 정보λ₯Ό μ„œλ²„μ—μ„œ μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀.
  • Stateless을 μ€‘μš”μ‹œν•˜λŠ” μ΄μœ λŠ” μ„œλ²„μ˜ ν™•μž₯μ„±μœΌλ‘œ 이어진닀.
  • Session의 경우 Session IDλ₯Ό Memoryλ“  DBλ“  μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ μ„œλ²„μ— μ €μž₯ν•œλ‹€.
  • κ°€λ Ή μ„œλΉ„μŠ€κ°€ ν₯ν–‰ν•΄μ„œ νŠΈλž˜ν”½ λΆ€ν•˜λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ„œλ²„μ˜ 수λ₯Ό λŠ˜λ¦°λ‹€κ³  ν•˜μž.
  • 이런 경우 μ—¬λŸ¬ 개의 μ„œλ²„μ—μ„œ κ΄€λ¦¬ν•˜λŠ” Session IDλŠ” μ„œλ‘œ κ³΅μœ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ‚¬μš©μž μš”μ²­μ— λŒ€ν•œ 인가 κΈ°λŠ₯이 μ μ ˆν•˜κ²Œ μ²˜λ¦¬λ˜μ§€ λͺ»ν•œλ‹€.Β 
  • μ΄λ•Œ Server Clusteringμ΄λ‚˜ Session μ €μž₯μ†Œλ₯Ό 외뢀에 λ‘ μœΌλ‘œμ¨ μ„œλ²„ κ°„ Session IDλ₯Ό κ³΅μœ ν•  수 μžˆμ§€λ§Œ 병λͺ© ν˜„μƒ λ“±μœΌλ‘œ Session Storage μ ‘κ·Ό 속도 μ €ν•˜λ‚˜ 쀑앙 Session Storage에 λΆ€ν•˜κ°€ μ§‘μ€‘λœλ‹€λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
  • λ˜ν•œ Server Clustering은 λ…Έλ“œ κ°„ 톡신 문제둜 Session 뢈일치 ν˜„μƒμ΄ λ°œμƒν•  수 μžˆλ‹€κ³  ν•œλ‹€.
  • 반면 JWTλŠ” μ‚¬μš©μž 정보λ₯Ό μ„œλ²„μ— μ €μž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ„œλ²„κ°€ λŠ˜μ–΄λ‚˜λ„ λ¬Έμ œκ°€ μ—†λ‹€λŠ” λœ»μ΄λ‹€.

JWT ꡬ쑰

  • JWTλŠ” .으둜 λΆ„λ¦¬λœ Header, Payload, Verify-Signature μ„Έ λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰œλ‹€.
  • μ—¬κΈ°μ„œ Header, PayloadλŠ” Base64Url둜 인코딩 된 λ¬Έμžμ—΄μ΄λ‹€.

βœ… Header

  • μ„œλͺ… μ•Œκ³ λ¦¬μ¦˜κ³Ό ν† ν°μ˜ νƒ€μž…μ„ ν¬ν•¨ν•œλ‹€.
  • μ„œλͺ… μ•Œκ³ λ¦¬μ¦˜μ—λŠ” HMAC SHA256 λ˜λŠ” RSA 등이 λ“€μ–΄κ°ˆ 수 μžˆλ‹€.
  • ν† ν°μ˜ νƒ€μž…μ—λŠ” JWTκ°€ λ¬Έμžμ—΄ κ°’μœΌλ‘œ λ“€μ–΄κ°„λ‹€.

βœ… Payload

  • μ‚¬μš©μžμ™€ μΆ”κ°€ 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν΄λ ˆμž„μ„ ν¬ν•¨ν•œλ‹€.
  • ν΄λ ˆμž„μ€ λ‹€μŒ μ„Έ κ°€μ§€ μœ ν˜•μœΌλ‘œ λ‚˜λ‰œλ‹€.
    1. λ“±λ‘λœ ν΄λ ˆμž„
      • ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ ꢌμž₯λ˜λŠ” ν΄λ ˆμž„μ΄λ‹€.
      • μƒν˜Έ μš΄μš©μ„±μ„ μœ„ν•΄ μ‚¬μš©λ˜λ©° JWT의 간결성을 μœ„ν•΄ ν΄λ ˆμž„ ν‚€λŠ” μ„Έ κΈ€μžλ‘œ μ œν•œλœλ‹€.
      • iss, exp, sub, aud, nbf, iat, jti 등이 μžˆλ‹€.
    2. 곡개 ν΄λ ˆμž„
      • κ³΅κ°œλ˜λ”λΌλ„ μƒκ΄€μ—†λŠ” μ •λ³΄λ‘œ, 좩돌 λ°©μ§€λ₯Ό μœ„ν•΄ URI둜 μ •μ˜ν•΄μ•Ό ν•œλ‹€.
    3. λΉ„κ³΅κ°œ ν΄λ ˆμž„
      • JWTλ₯Ό μ‚¬μš©ν•˜λŠ” λ‹Ήμ‚¬μž κ°„μ˜ ν•©μ˜μ— 따라 μ •μ˜λœ μ»€μŠ€ν…€ ν΄λ ˆμž„μœΌλ‘œ, λ“±λ‘λ˜κ±°λ‚˜ κ³΅κ°œλ˜μ§€ μ•Šμ€ 정보이닀.

βœ… Verify-Signature

  • μ„œλͺ…을 톡해 λ©”μ‹œμ§€κ°€ 전솑 쀑 λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€λŠ” 사싀과 JWT의 λ°œμ‹ μžκ°€ μ˜¬λ°”λ₯Έμ§€ 확인할 수 μžˆλ‹€.
  • μ„œλͺ…을 μƒμ„±ν•˜λ €λ©΄ μ•„λž˜ ν•­λͺ©λ“€μ„ κ²°ν•©ν•˜μ—¬ μ„œλͺ…ν•΄μ•Ό ν•œλ‹€.
    1. 인코딩 된 Header
    2. 인코딩 된 Payload
    3. λΉ„κ³΅κ°œ ν‚€
    4. Header에 μ§€μ •λœ μ•Œκ³ λ¦¬μ¦˜

JWT μž‘λ™ 원리

  • μΈμ¦μ—μ„œ μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν•˜λ©΄ JWTκ°€ λ°˜ν™˜ λœλ‹€.
  • 토큰은 자격 증λͺ…μ΄λ―€λ‘œ λ³΄μ•ˆ 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ κΈ°κ°„ 이상 λ³΄κ΄€ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.
  • λ³΄μ•ˆμ΄ λΆ€μ‘±ν•œ λΈŒλΌμš°μ € μ €μž₯μ†Œμ— λ―Όκ°ν•œ Session 데이터λ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€κ³  ν•œλ‹€.
  • Local Storageλ³΄λ‹€λŠ” HTTP-Only Cookie에 Session 데이터λ₯Ό κ΄€λ¦¬ν•˜λŠ” 것이 λ³΄μ•ˆμ„±μ„ 높일 수 μžˆλ‹€κ³  ν•œλ‹€.
  • μ‚¬μš©μžκ°€ 보호된 κ²½λ‘œλ‚˜ Resource에 μ ‘κ·Όν•˜λ € ν•  λ•Œ, ν΄λΌμ΄μ–ΈνŠΈλŠ” JWTλ₯Ό 전솑해야 ν•œλ‹€.
  • 일반적으둜 λ‹€μŒκ³Ό 같이 Authorization 헀더에 Bearer Schemaλ₯Ό μ‚¬μš©ν•˜μ—¬ JWTλ₯Ό 보낸닀.
1
Authorization: Bearer <token>
  • μ„œλ²„μ—μ„œλŠ” Authorization ν—€λ”μ—μ„œ μœ νš¨ν•œ JWTλ₯Ό ν™•μΈν•˜κ³ , μœ νš¨ν•˜λ©΄ μ‚¬μš©μžκ°€ 보호된 Resource에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν—ˆμš©ν•œλ‹€.

JWTλ₯Ό ν†΅ν•œ 일반적인 둜그인 κ³Όμ •

  1. μ‚¬μš©μžκ°€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ‘œκ·ΈμΈμ„ ν•œλ‹€.
  2. μ„œλ²„μ—μ„œ Access Tokenκ³Ό Refreshh Token을 λ°˜ν™˜ν•œλ‹€.
  3. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ Resourceλ₯Ό μš”μ²­ν•  λ•Œλ§ˆλ‹€ Access Token을 ν¬ν•¨ν•œλ‹€.
  4. μ„œλ²„μ—μ„œ ν•΄λ‹Ή 토큰이 μœ νš¨ν•œμ§€ ν™•μΈν•œλ‹€.
  5. λ§Œμ•½ 유효 기간이 λ§Œλ£Œλ˜λŠ” λ“± μœ νš¨ν•˜μ§€ μ•Šμ„ 경우 Refresh Token을 ν™•μΈν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ— Access Tokenκ³Ό Refresh Token을 μž¬λ°œκΈ‰ν•œλ‹€.

회고

  • μž‘λ…„μ— JWT 인증을 κ΅¬ν˜„ν•΄ λ³Έ 적은 μžˆλŠ”λ° λ‹Ήμ‹œ Google 검색을 톡해 μ½”λ“œλ₯Ό λŒ€λΆ€λΆ„ κ°€μ Έλ‹€ 썼던 기얡이 μžˆλ‹€.
  • κ·Έ λ‹Ήμ‹œ 원리λ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆκΈ° λ•Œλ¬Έμ— Refresh Token을 DB에 μ €μž₯ν•΄μ„œ Stateless도 μ§€μΌœμ§€μ§€ μ•Šμ•˜λ‹€.
This post is licensed under CC BY 4.0 by the author.