Post

[Security] Secure Coding(5-3) - JWT(JSON Web Token)

[Security] Secure Coding(5-3) - JWT(JSON Web Token)

πŸ”’ μ‹œνμ–΄ μ½”λ”© μˆ˜μ—… 정리

JWT(JSON Web Token)

πŸ“šJWT(JSON Web Token): JSON ν˜•μ‹μ˜ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜κΈ° μœ„ν•œ 개방 ν‘œμ€€(RFC 7519)

  • 주둜 인증(Authentication)κ³Ό 인가(Authorization)에 μ‚¬μš©λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ κ°„ 정보λ₯Ό κ΅ν™˜ν•˜λŠ” μš©λ„λ‘œ ν™œμš©

βœ…νŠΉμ§•:

  1. 자체 포함: 토큰 내에 μ‚¬μš©μž 정보, 만료 μ‹œκ°„ λ“±μ˜ 정보λ₯Ό ν¬ν•¨ν•˜μ—¬ 별도 μ €μž₯μ†Œ 없이 인증 κ°€λŠ₯
  2. κ²½λŸ‰(Compact): URL, 헀더, μΏ ν‚€ λ“± λ‹€μ–‘ν•œ ν™˜κ²½μ—μ„œ μ „μ†‘ν•˜κΈ° μ ν•©ν•œ 크기
  3. μ„œλͺ…(Signature): ν† ν°μ˜ μœ„λ³€μ‘° μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ HMAC, RSA, ECDSA λ“±μ˜ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ„œλͺ…

JWT ꡬ성 및 λ™μž‘ 방식

alt text

βœ…JWT κ΅¬μ„±μš”μ†Œ:

  • 헀더(Header)
    • ν† ν°μ˜ νƒ€μž…(JWT)κ³Ό μ„œλͺ…에 μ‚¬μš©ν•  μ•Œκ³ λ¦¬μ¦˜ 정보(예: HS256, RS256)
  • νŽ˜μ΄λ‘œλ“œ(Payload)
    • 인증 κ΄€λ ¨ 정보(ν΄λ ˆμž„, claims)
    • ν‘œμ€€ ν΄λ ˆμž„: iss(λ°œκΈ‰μž), exp(λ§Œλ£Œμ‹œκ°„), sub(주체), aud(λŒ€μƒ) λ‘₯
    • μ»€μŠ€ν…€ ν΄λ ˆμž„: μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ³„ μΆ”κ°€ 데이터
  • μ„œλͺ…(Signature)
    • 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό λΉ„λ°€ ν‚€λ‘œ μ„œλͺ…ν•˜μ—¬ μœ„λ³€μ‘° λ°©μ§€

βœ…λ™μž‘ 원리:

  • ν΄λΌμ΄μ–ΈνŠΈ: 인증 ν›„ JWTλ₯Ό λ°œκΈ‰λ°›μ•„ 이후 μš”μ²­ν•  λ•Œλ§ˆλ‹€ 포함
  • μ„œλ²„: JWT의 μ„œλͺ…을 κ²€μ¦ν•˜μ—¬ ν† ν°μ˜ μœ νš¨μ„±μ„ ν™•μΈν•œ ν›„, νŽ˜μ΄λ‘œλ“œ λ‚΄ 정보λ₯Ό 기반으둜 κΆŒν•œ λΆ€μ—¬

JWT μž₯점

βœ…μž₯점:

  1. λ¬΄μƒνƒœμ„±(Stateless & Self-contained)
    • μ„œλ²„μ— λ³„λ„μ˜ μ„Έμ…˜ μ €μž₯μ†Œκ°€ ν•„μš” μ—†μ–΄, ν™•μž₯μ„±κ³Ό λΆ„μ‚° μ‹œμŠ€ν…œμ— 적합
  2. λΉ λ₯Έ 검증 및 μ„±λŠ₯
    • JWTλŠ” μžμ²΄μ— λͺ¨λ“  정보λ₯Ό ν¬ν•¨ν•˜λ―€λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€ 쑰회 없이도 신원 검증 κ°€λŠ₯
  3. μœ μ—°ν•œ ν΄λ ˆμž„ ꡬ쑰
    • ν‘œμ€€ ν΄λ ˆμž„ 외에도 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ§žμΆ€ν˜•(claims) 데이터λ₯Ό 포함할 수 μžˆμ–΄ λ‹€μ–‘ν•œ 정보 κ΅ν™˜μ΄ 용이
  4. ν‘œμ€€ 기반
    • RFC 7519에 μ˜ν•΄ μ •μ˜λ˜μ–΄ λ‹€μ–‘ν•œ ν”Œλž«νΌκ³Ό μ–Έμ–΄μ—μ„œ 지원 및 ν˜Έν™˜μ„± 보μž₯\

JWT 단점

βŒλ‹¨μ :

  1. 정보 λ…ΈμΆœ 문제
    • 기본적으둜 Base64 인코딩 β†’ μ•”ν˜Έν™”ν•˜μ§€ μ•ŠμœΌλ©΄ λˆ„κ΅¬λ‚˜ νŽ˜μ΄λ‘œλ“œ λ‚΄μš©μ„ 확인 κ°€λŠ₯
  2. 토큰 νƒˆμ·¨ μœ„ν—˜
    • 토큰 μžμ²΄μ— μ€‘μš”ν•œ 정보가 ν¬ν•¨λ˜μ–΄ 있으며, 만료 κΈ°κ°„ λ™μ•ˆ λ…ΈμΆœ μ‹œ μ•…μš© κ°€λŠ₯ (HTTPS λ“± 전솑 λ³΄μ•ˆ ν•„μš”)
  3. 토큰 λ¬΄νš¨ν™”μ˜ 어렀움
    • λ°œκΈ‰λœ JWTλŠ” 만료 μ „κΉŒμ§€ 유효 β†’ νƒˆμ·¨ μ‹œ λΉ λ₯Έ λ¬΄νš¨ν™”κ°€ μ–΄λ ΅κ³  μž¬λ°œκΈ‰ 관리가 볡작
  4. 크기 및 μ˜€λ²„ν—€λ“œ
    • μ—¬λŸ¬ ν΄λ ˆμž„μ„ 포함할 경우 토큰 크기가 컀져 전솑 μ˜€λ²„ν—€λ“œκ°€ λ°œμƒ κ°€λŠ₯

JWT 기반 인증 흐름

alt text

JWTλ₯Ό ν™œμš©ν•œ μ‚¬μš©μž 인가 및 κΆŒν•œ 관리

  • 토큰 λ‚΄ Claims ν™œμš©
    • JWT νŽ˜μ΄λ‘œλ“œμ— μ‚¬μš©μž μ‹λ³„μž, μ—­ν• (role), κΆŒν•œ(permission) λ“±μ˜ 정보λ₯Ό 포함
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” 인증 ν›„ JWTλ₯Ό λ°œκΈ‰λ°›μ•„, 이후 μš”μ²­ μ‹œ HTTP 헀더에 포함 (Bearer <token>)
  • μ„œλ²„ μΈ‘ 검증 및 인가 κ³Όμ •
    • μ„œλ²„λŠ” JWT의 μ„œλͺ…, λ§Œλ£Œμ‹œκ°„, λ°œκΈ‰μž 등을 κ²€μ¦ν•˜μ—¬ ν† ν°μ˜ 무결성 확인
    • νŽ˜μ΄λ‘œλ“œμ˜ ν΄λ ˆμž„μ„ 기반으둜 μ‚¬μš©μžμ˜ μ ‘κ·Ό κΆŒν•œ 및 인가 κ²°μ •
    • 예) νŠΉμ • API에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ—­ν•  λ˜λŠ” κΆŒν•œμ΄ JWT ν΄λ ˆμž„μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인
  • λ¬΄μƒνƒœ(Stateless) 인증
    • μ„œλ²„λŠ” λ³„λ„μ˜ μ„Έμ…˜ μ €μž₯μ†Œ 없이, JWT λ‚΄ 정보λ₯Ό ν™œμš©ν•˜μ—¬ 인가λ₯Ό μˆ˜ν–‰
    • λΆ„μ‚° μ‹œμŠ€ν…œ 및 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ν™˜κ²½μ—μ„œ 효과적
  • 토큰 만료 및 κ°±μ‹ 
    • 짧은 만료 μ‹œκ°„ μ„€μ •μœΌλ‘œ κΆŒν•œ λ³€κ²½ μ‹œ λΉ λ₯Έ 반영 κ°€λŠ₯
    • Refresh Tokenκ³Ό 토큰 νšŒμ „ μ „λž΅μ„ 톡해, 였래된 κΆŒν•œ 정보λ₯Ό κ°€μ§„ 토큰 μ‚¬μš© λ°©μ§€
  • 동적 κΆŒν•œ κ΄€λ¦¬μ˜ ν•œκ³„ 및 보완
    • μ‚¬μš©μž κΆŒν•œ λ³€κ²½ μ‹œ, κΈ°μ‘΄ JWT에 λ°˜μ˜λ˜μ§€ μ•ŠμœΌλ―€λ‘œ 주기적 토큰 κ°±μ‹  λ˜λŠ” 별도 인가 체크 ν•„μš”
    • 쀑앙 인가 μ„œλ²„μ™€μ˜ 연계λ₯Ό 톡해 μ‹€μ‹œκ°„ κΆŒν•œ μ—…λ°μ΄νŠΈ κ΅¬ν˜„ κ³ λ €
  • λ³΄μ•ˆ κ°•ν™”
    • HTTPSλ₯Ό ν†΅ν•œ μ•ˆμ „ν•œ 전솑, HttpOnly/ Sec`ure μΏ ν‚€ λ“± μ•ˆμ „ν•œ μ €μž₯μ†Œ ν™œμš©
    • μ΅œμ†Œν•œμ˜ μ •λ³΄λ§Œ ν¬ν•¨ν•˜κ³ , 민감 μ •λ³΄λŠ” 별도 μ•”ν˜Έν™” λ˜λŠ” μ•ˆμ „ν•œ 관리

JWT κ΅¬ν˜„

1. JWT 라이브러리(JJWT) μΆ”κ°€

alt text

2. μƒμˆ˜κ°’ μ„€μ •

alt text

3. μ—”λ“œν¬μΈνŠΈ κ΅¬ν˜„

alt text

alt text

alt text

4. κ΅¬ν˜„λœ JWT κΈ°λŠ₯ ν…ŒμŠ€νŠΈ

alt text

alt text

alt text


JWT λ³΄μ•ˆ 및 취약점 λŒ€μ‘

μ„œλͺ…κ³Ό ν‚€ 관리

  • JWT μ„œλͺ…μ˜ μ—­ν• 
    • ν† ν°μ˜ 무결성과 μ§„μœ„ 보증: 헀더와 νŽ˜μ΄λ‘œλ“œκ°€ λ³€μ‘°λ˜μ§€ μ•Šμ•˜μŒμ„ 확인
    • 토큰 μœ„λ³€μ‘° λ°©μ§€λ₯Ό μœ„ν•œ λ””μ§€ν„Έ μ„œλͺ… μ μš©β€™
  • μ„œλͺ… μ•Œκ³ λ¦¬μ¦˜ μ’…λ₯˜
    • λŒ€μΉ­ν‚€ μ•Œκ³ λ¦¬μ¦˜: HS256, HS384, HS512
    • λŒ€μΉ­ν‚€: λ™μΌν•œ λΉ„λ°€ν‚€λ‘œ μ„œλͺ…κ³Ό 검증 μˆ˜ν–‰
    • λΉ„λŒ€μΉ­ν‚€ μ•Œκ³ λ¦¬μ¦˜: RS256, RS384, RS512, ES256 λ“±
    • λΉ„λŒ€μΉ­ν‚€: κ°œμΈν‚€λ‘œ μ„œλͺ…, κ³΅κ°œν‚€λ‘œ 검증 μˆ˜ν–‰
  • μ„œλͺ… κ³Όμ •
    • 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό Base64 URL 인코딩 β†’ λΉ„λ°€ ν‚€(λ˜λŠ” κ°œμΈν‚€)둜 μ„œλͺ… 생성 β†’ μ΅œμ’… JWT ꡬ성
  • μ•Œκ³ λ¦¬μ¦˜ ν˜Όλ™ 곡격
    • κ³΅κ²©μžκ°€ β€œnoneβ€œμ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜κ±°λ‚˜ λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μœ„μž₯ν•˜μ—¬ μ„œλͺ… 우회 μ‹œλ„
    • λŒ€μ‘ λ°©μ•ˆ: ν—ˆμš© μ•Œκ³ λ¦¬μ¦˜(HS256, RS256)을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •, 라이브러리 μ•Œκ³ λ¦¬μ¦˜ 검증 κ°•ν™”
  • λΉ„λ°€ ν‚€/개인 ν‚€ 유좜
    • ν‚€κ°€ λ…ΈμΆœλ˜λ©΄ 토큰 μœ„μ‘°κ°€ κ°€λŠ₯ β†’ 인증 우회 및 κΆŒν•œ νƒˆμ·¨ μœ„ν—˜ 증가
    • λŒ€μ‘ λ°©μ•ˆ:
      • κ°•λ ₯ν•œ ν‚€ 생성 및 μ•ˆμ „ν•œ μ €μž₯(HSM, ν΄λΌμš°λ“œ ν‚€ 관리 μ„œλΉ„μŠ€)
      • ν‚€ μ ‘κ·Ό κΆŒν™˜ μ΅œμ†Œν™” 및 μ •μ±… κ°•ν™”
  • ν‚€ ꡐ체 및 νšŒμ „ 관리 미흑
    • ν‚€ νšŒμ „ μ‹œ κΈ°μ‘΄ 토큰 검증 문제, λ§Œλ£Œλ˜μ§€ μ•Šμ€ 토큰이 μ•…μš©λ  μœ„ν—˜
    • λŒ€μ‘ λ°©μ•ˆ: 정기적인 ν‚€ νšŒμ „ μ •μ±…κ³Ό 토큰 μž¬λ°œκΈ‰, JWKS μ—”λ“œν¬μΈνŠΈ ν™œμš©

μœ νš¨κΈ°κ°„ 관리

πŸ“šJWT μœ νš¨κΈ°κ°„μ˜ μ—­ν• : 만료 μ‹œκ°„μ„ 톡해 νƒˆμ·¨λœ ν† ν°μ˜ μ‚¬μš© 기간을 μ œν•œν•˜μ—¬ ν”Όν•΄ μ΅œμ†Œν™”

  • 만료 μ‹œκ°„(exp) ν΄λ ˆμž„: JWT 내에 ν¬ν•¨λ˜μ–΄ ν† ν°μ˜ 유효 기간을 λͺ…μ‹œ

  • μœ νš¨κΈ°κ°„ μ„€μ •μ˜ μ€‘μš”μ„±
    • λ„ˆλ¬΄ κΈ΄ μœ νš¨κΈ°κ°„μ€ 토큰 νƒˆμ·¨ μ‹œ μž₯κΈ°κ°„ μ•…μš© μœ„ν—˜ 증가
    • λ„ˆλ¬΄ 짧은 μœ νš¨κΈ°κ°„μ€ μ‚¬μš©μž κ²½ν—˜ μ €ν•˜ 및 μž¦μ€ 재인증 μš”κ΅¬
    • μ„œλΉ„μŠ€ νŠΉμ„±μ— 맞게 μ μ ˆν•œ μœ νš¨κΈ°κ°„ νŒλ‹¨ ν•„μš”
  • μœ νš¨κΈ°κ°„ 관리 μ „λž΅ * 짧은 만료 μ‹œκ°„μœΌλ‘œ μ„€μ •ν•œ Access Token μ‚¬μš©ν•˜λ©΄μ„œ μƒλŒ€μ μœΌλ‘œ κΈ΄ 만료 μ‹œκ°„μ˜ Refresh Token을 ν†΅ν•œ μž¬λ°œκΈ‰ μ „λž΅ μ‚¬μš©

JWT νƒˆμ·¨

μ£Όμš” JWT νƒˆμ·¨ 경둜

  • XSS 곡격
    • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μž…λ ₯κ°’ 검증 미흑 취약점을 μ•…μš©ν•˜μ—¬ μ•…μ„± 슀크립트 μ‚½μž…μ„ 톡해 JWTλ₯Ό νƒˆμ·¨
  • λΆˆμ•ˆμ „ν•œ μ €μž₯μ†Œ
    • 둜컬 μŠ€ν† λ¦¬μ§€λ‚˜ μ„Έμ…˜ μŠ€ν† λ¦¬μ§€μ— JWTλ₯Ό μ €μž₯ν•  경우, μ•…μ„± μ½”λ“œμ— μ˜ν•΄ 유좜 μœ„ν—˜ 쑴재
  • 전솑 쀑 νƒˆμ·¨
    • HTTPS 미적용 λ˜λŠ” μ·¨μ•½ν•œ TLS μ„€μ • μ‹œ λ„€νŠΈμ›Œν¬ μŠ€λ‹ˆν•‘ 곡격에 λ…ΈμΆœ

μœ„ν—˜ μš”μ†Œ μš”μ•½

  • JWT νƒˆμ·¨ μ‹œ, νƒˆμ·¨λœ ν† ν°μœΌλ‘œ 정상 μ‚¬μš©μžμ˜ κΆŒν•œμ„ λ„μš©ν•˜μ—¬ μ‹œμŠ€ν…œμ— μ ‘κ·Όν•  수 있음
    • λŒ€μ‘ λ°©μ•ˆ
    • μΆ©μ‹€ν•œ XSS λ°©μ–΄
    • μ•ˆμ „ν•œ μ €μž₯μ†Œ μ‚¬μš©
    • 전솑 λ³΄μ•ˆ 확보
This post is licensed under CC BY 4.0 by the author.