JWT(Json Web Token) ꡬ쑰 μ΄ν•΄ν•˜κΈ°

2025. 5. 25. 19:58·🌿Spring

JWT (JSON Web Token) μ΄λž€

JWT(JSON Web Token)μ΄λž€ μœ μ €λ₯Ό μΈμ¦ν•˜κ³  μ‹λ³„ν•˜κΈ° μœ„ν•œ JSON 토큰을 μ˜λ―Έν•©λ‹ˆλ‹€.

이 토큰 λ‚΄μ—λŠ” μ‚¬μš©μžμ˜ κΆŒν•œ 정보와 같은 인증 정보가 Base64 URL λ°©μ‹μœΌλ‘œ μΈμ½”λ”©λ˜μ–΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

ν΄λΌμ΄μ–ΈνŠΈκ°€ 토큰을 HTTP 헀더에 μ‹€μ–΄ 응닡을 보내 μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ‹λ³„ν•˜κ³  인증/인가λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.


JWT ꡬ쑰

JWTλŠ” μ„Έ 파트둜 λ‚˜λˆ„μ–΄μ§€λ©°, 각 νŒŒνŠΈλŠ” 점으둜 κ΅¬λΆ„λ©λ‹ˆλ‹€.

헀더(Header), νŽ˜μ΄λ‘œλ“œ(Payload), μ„œλͺ…(Signature)으둜 κ΅¬μ„±λ©λ‹ˆλ‹€.

좜처: https://research.securitum.com/jwt-json-web-token-security/

헀더(Header)

ν—€λ”μ—λŠ” ν•΄μ‹œ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜κ³Ό 토큰 νƒ€μž… 정보가 μžˆμŠ΅λ‹ˆλ‹€.

  • μ•Œκ³ λ¦¬μ¦˜: μ„œλͺ… 생성에 μ‚¬μš©ν•  μ•Œκ³ λ¦¬μ¦˜ μ’…λ₯˜
    • ex) HS256, RS256
  • νƒ€μž…: ν† ν°μ˜ νƒ€μž…, μ—¬κΈ°μ„œλŠ” JWTκ°€ 되죠.

νŽ˜μ΄λ‘œλ“œ(Payload)

νŽ˜μ΄λ‘œλ“œμ—λŠ” 토큰에 λ‹΄κΈΈ, μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ£Όκ³ λ°›κ³ μž ν•˜λŠ” μ‹€μ œ 정보듀이 μžˆμŠ΅λ‹ˆλ‹€.

정보 ν•˜λ‚˜λ₯Ό 'ν΄λ ˆμž„(claim)'이라고 ν•©λ‹ˆλ‹€.

  • ν΄λ ˆμž„: key(name)-value ν˜•μ‹μœΌλ‘œ 이루어진 ν•œ 쌍의 정보 
  • ν΄λ ˆμž„ μ˜ˆμ‹œ
    • ν‘œμ€€ ν΄λ ˆμž„(Registered Claim): JWT μ‚¬μ–‘μ—μ„œ μ •μ˜ν•œ ν΄λ ˆμž„ 
      • iss(issuer: λ°œν–‰μž)
      • exp(expiration time: 만료 μ‹œκ°„)
      • sub(subject: 제λͺ©)
      • iat(issue at: λ°œν–‰ μ‹œκ°„)
      • jti(JWT ID)
    • 곡개 ν΄λ ˆμž„(Public Claim): 사전에 μ •μ˜λœ, 곡개용 정보 전달을 μœ„ν•œ ν΄λ ˆμž„
    • λΉ„κ³΅κ°œ ν΄λ ˆμž„(Private Claim): λ°œκΈ‰μžμ™€ μˆ˜μ‹ μž κ°„μ˜ ν˜‘μ˜μ— 따라 μ •μ˜λœ ν΄λ ˆμž„

 

μ„œλͺ…(Signature)

μ„œλͺ…은 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό 이어 뢙인 ν›„, μ‹œν¬λ¦Ώ(Secret Key) λ˜λŠ” 프라이빗 ν‚€(Private Key)둜 μ•”ν˜Έν™”ν•œ κ°’μž…λ‹ˆλ‹€.

μ•”ν˜Έν™”λŠ” ν—€λ”μ—μ„œ μ •μ˜ν•œ μ•Œκ³ λ¦¬μ¦˜ 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€.

 

μ΄λ•Œ ν‚€(Key)λŠ” μ„œλ²„μ—μ„œλ§Œ κ°–κ³  μžˆλŠ” κ°’μœΌλ‘œ 이 λΉ„λ°€ν‚€κ°€ μœ μΆœλ˜μ§€ μ•ŠλŠ” 이상 타인이 λ³΅ν˜Έν™”ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ„œλͺ…은 헀더와 νŽ˜μ΄λ‘œλ“œμ˜ 무결성을 보μž₯ν•©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ 토큰을 μœ„μ‘°ν•˜μ§€ μ•Šμ•˜μŒμ„ μ„œλ²„κ°€ μ„œλͺ…을 κ²€μ¦ν•˜μ—¬ 확인할 수 있게 ν•΄μ€λ‹ˆλ‹€.

 

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

+ JWT μ˜ˆμ‹œ

JWTλŠ” Base64URL둜 인코딩이 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Base64URL은 μ›Ή(URL) ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„λœ 인코딩 λ°©μ‹μœΌλ‘œ

λˆ„κ΅¬λ‚˜ λ””μ½”λ”©ν•  수 μžˆμ–΄ μ•”ν˜Έν™”μ˜ κΈ°λŠ₯은 μ—†μŠ΅λ‹ˆλ‹€.

 

https://jwt.io/μ—μ„œ JWT Decoder / Encoder μ²΄ν—˜μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


JWT λ™μž‘ 방식

  1. μ‚¬μš©μžλŠ” 아이디/λΉ„λ°€λ²ˆν˜Έ λ“±μ˜ 인증 정보λ₯Ό μž…λ ₯ν•΄ μ„œλ²„λ‘œ 둜그인 μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€.
  2. μ„œλ²„λŠ” μž…λ ₯받은 정보λ₯Ό ν™•μΈν•˜κ³ , 인증이 μ„±κ³΅ν•˜λ©΄  JWTλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 
    • 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό μ •μ˜ν•˜κ³ , μ‹œν¬λ¦Ώ 킀와 νŽ˜μ΄λ‘œλ“œλ₯Ό 헀더에 μ •μ˜λœ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ•”ν˜Έν™”ν•˜μ—¬ μ„œλͺ…을 λ§Œλ“­λ‹ˆλ‹€.
  3. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„λ‘œλΆ€ν„° 받은 JWTλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€(둜컬 μŠ€ν† λ¦¬μ§€ λ“±). 이후 μš”μ²­ μ‹œ HTTP 헀더 Authorization에 λ‹€μŒκ³Ό 같이 JWTλ₯Ό λ‹΄μ•„ λ³΄λƒ…λ‹ˆλ‹€.
    • Authorization: Bearer <JWT>
  4. μ„œλ²„λŠ” ν† ν°μ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•©λ‹ˆλ‹€.
    • μ„œλͺ…이 μœ νš¨ν•œμ§€, 만료 μ‹œκ°„μ΄ μ§€λ‚˜μ§€ μ•Šμ•˜λŠ”μ§€
  5. μ„œλ²„λŠ” νŽ˜μ΄λ‘œλ“œμ—μ„œ μ‚¬μš©μž 정보λ₯Ό μΆ”μΆœν•˜μ—¬ 인가 처리λ₯Ό ν•©λ‹ˆλ‹€.
  6. μ„œλ²„λŠ” ν•΄λ‹Ή μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , κ²°κ³Όλ₯Ό μ‘λ‹΅μœΌλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ‘λ‹΅ν•©λ‹ˆλ‹€.

JWT μž₯단점

βœ… μž₯점

  • μ„Έμ…˜ μ €μž₯μ†Œ λΆˆν•„μš” (Stateless)
    • JWT μžμ²΄κ°€ 인증된 정보λ₯Ό ν¬ν•¨ν•˜λ―€λ‘œ, μ„Έμ…˜ μ €μž₯μ†Œ 같은 λ³„λ„μ˜ μ €μž₯μ†Œκ°€ ν•„μš” μ—†μŠ΅λ‹ˆλ‹€.
    • λ”°λΌμ„œ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό κΈ°μ–΅ν•˜μ§€ μ•ŠλŠ” λ¬΄μƒνƒœ(stateless) κ΅¬μ‘°λ‘œ λ™μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ„œλ²„ ν™•μž₯에 유리
    • λ¬΄μƒνƒœ μ•„ν‚€ν…μ²˜ 덕뢄에, μ„œλ²„ κ°„ μ„Έμ…˜ κ³΅μœ κ°€ ν•„μš” μ—†μ–΄ ν™•μž₯에 μ ν•©ν•©λ‹ˆλ‹€.
  • μ‚¬μš©μž 인증 정보가  μΈμ¦ 정보가 νŽ˜μ΄λ‘œλ“œμ— ν¬ν•¨λ˜μ–΄ μžˆμ–΄, μš”μ²­ μ‹œλ§ˆλ‹€ DBλ₯Ό μ‘°νšŒν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.
  • λΉ„λ°€ ν‚€λ₯Ό 기반으둜 μ„œλͺ…을 μƒμ„±ν•˜λ―€λ‘œ 데이터 μœ„λ³€μ‘°λ₯Ό 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’₯ 단점

  • 토큰 μžμ²΄μ— μ‚¬μš©μž 정보가 μžˆμœΌλ―€λ‘œ, 토큰 νƒˆμ·¨ μ‹œ μœ„ν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 토큰을 μ„œλ²„κ°€ μ•„λ‹Œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έ νƒˆμ·¨λ‹Ήν•˜λ©΄ λŒ€μ²˜ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
    • 이미 λ°œκΈ‰λœ 토큰을 쀑간에 κ°•μ œλ‘œ λ¬΄νš¨ν™”ν•˜κΈ° νž˜λ“­λ‹ˆλ‹€.
  • νŽ˜μ΄λ‘œλ“œμ— λ§Žμ€ 정보λ₯Ό λ‹΄μ•„ 토큰이 κΈΈμ–΄μ§€λ©΄ λ„€νŠΈμ›Œν¬ μ„±λŠ₯에 뢀담이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 토큰 만료 μ‹œκ°„ λ”œλ ˆλ§ˆ
    • λ„ˆλ¬΄ 짧으면 μž¦μ€ μž¬λ°œκΈ‰μœΌλ‘œ λΆˆνŽΈν•˜κ³ 
    • λ„ˆλ¬΄ κΈΈλ©΄ νƒˆμ·¨ μ‹œ μž₯κΈ°κ°„ μ•…μš©λ  수 μžˆμ–΄ μ λ‹Ήνžˆ κ· ν˜•μž‘μ•„μ•Ό ν•©λ‹ˆλ‹€.

 

참고자료

https://ivory-room.tistory.com/88

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

https://research.securitum.com/jwt-json-web-token-security/

https://www.geeksforgeeks.org/json-web-token-jwt/

 

 

 

 

 

 

'🌿Spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Spring] IoC μ œμ–΄μ˜ μ—­μ „  (1) 2025.08.12
Springμ—μ„œ μΊμ‹œ μ‚¬μš©ν•˜κΈ°: CaffeineCache, @Cacheable, @CachePut, @CacheEvict  (1) 2025.06.12
[Spring Security] μ›Ή λ³΄μ•ˆ 곡격 #2 μ„Έμ…˜ κ³ μ • 곡격, JWT 토큰 νƒˆμ·¨ + λŒ€μ‘ μ „λž΅  (0) 2025.05.23
[Spring Security] μ›Ή λ³΄μ•ˆ 곡격 #1: CSRF곡격과 XSS 곡격 + λŒ€μ‘ μ „λž΅  (1) 2025.05.23
[Spring Security] Role Hierarchy: κΆŒν•œ 계측 ꡬ쑰 κ°œλ… 정리 & 적용  (1) 2025.05.22
'🌿Spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Spring] IoC μ œμ–΄μ˜ μ—­μ „
  • Springμ—μ„œ μΊμ‹œ μ‚¬μš©ν•˜κΈ°: CaffeineCache, @Cacheable, @CachePut, @CacheEvict
  • [Spring Security] μ›Ή λ³΄μ•ˆ 곡격 #2 μ„Έμ…˜ κ³ μ • 곡격, JWT 토큰 νƒˆμ·¨ + λŒ€μ‘ μ „λž΅
  • [Spring Security] μ›Ή λ³΄μ•ˆ 곡격 #1: CSRF곡격과 XSS 곡격 + λŒ€μ‘ μ „λž΅
μ†Œμ˜ πŸ€
μ†Œμ˜ πŸ€
Hello World ✨
  • μ†Œμ˜ πŸ€
    Soyoung's Dev Lab
    μ†Œμ˜ πŸ€
  • 전체
    였늘
    μ–΄μ œ
  • κΈ€μ“°κΈ° 관리
    • λΆ„λ₯˜ 전체보기 (79)
      • πŸ“’ κ²Œμ‹œνŒ (0)
      • 🌿Spring (20)
      • β˜•Java (7)
        • μ½”λ”©ν…ŒμŠ€νŠΈ (7)
      • βš™οΈ CS (26)
        • πŸ›œ λ„€νŠΈμ›Œν¬ (5)
        • πŸ“Š λ°μ΄ν„°λ² μ΄μŠ€ (8)
        • πŸ–²οΈμš΄μ˜μ²΄μ œ (9)
        • πŸ“š 자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜ (4)
      • πŸ“€ 배포 (4)
        • Docker (4)
        • AWS (0)
      • πŸ“° 기타 개발 자료 (12)
      • πŸ–₯️ ν”„λ‘œμ νŠΈ (0)
      • πŸ‘©‍πŸ’» ν™œλ™ & ν›„κΈ° (1)
      • 🍡 이야기 (2)
  • λΈ”λ‘œκ·Έ 메뉴

    • νƒœκ·Έ
  • 링크

    • github
    • velog
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    자료ꡬ쑰
    배포
    Java
    docker
    μ½”λ“œμž‡ μŠ€ν”„λ¦°νŠΈ
    객체지ν–₯ν”„λ‘œκ·Έλž˜λ°
    GIT
    λ°μ΄ν„°λ² μ΄μŠ€
    μœ„ν΄λ¦¬ 페이퍼
    λ„€νŠΈμ›Œν¬
    Spring
    운영체제
    Spring Security
    μ½”λ”©ν…ŒμŠ€νŠΈ
    개발
    μ•Œκ³ λ¦¬μ¦˜
    μ„œλ²„
    기술 λ©΄μ ‘
  • 졜근 λŒ“κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
μ†Œμ˜ πŸ€
JWT(Json Web Token) ꡬ쑰 μ΄ν•΄ν•˜κΈ°
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”