Spring/Spring Security

[JWT] 1. Introduction

noahkim_ 2023. 10. 3. 01:44

1. JWT

  • JSON 형식의 표준 토큰 (RFC 7519)
  • URL의 일부 혹은 HTTP 헤더에 포함시켜 토큰을 전달합니다.

 

특징

항목 설명
경량성
- 구조가 간결하고 크기가 작음
 제약된 환경에서 효율적으로 사용 가능 (모바일, IoT 등)
보안성
- 데이터 무결성: 서명 포함 → 위조 여부 검증 가능 (알고리즘: HMAC, RSA)
- 암호화: 민감한 데이터 보호
자급자족(Self-contained) - 필요한 정보를 토큰 내에 포함 가능
- 서버가 별도의 세션/DB 상태를 유지할 필요 없음

 

2. 구성

구성 요소 설명 구성 상세 정보
Header 토큰의 메타데이터
alg: 서명에 사용된 알고리즘
typ: 토큰 타입 (보통 "JWT")
- HS256(HMAC + SHA-256): 하나의 비밀키로 서명+검증 수행
-
RS256(RSA + SHA-256): 개인키로 서명, 공개키로 검증 
-
ES256(ECDSA + SHA-256): RS256보다 경량화된 방식
Payload 토큰에 담긴 정보 Claim: key-value 쌍의 데이터
- Registered Claims: iss, exp, sub, aud 등
- Public Claims: 충돌 방지를 위한 URI 기반 네임스페이스 사용
- Private Claims: 발급자와 수신자 간 사용자 정의 클레임
Signature 토큰 서명 서명값
base64UrlEncode(header) +
"." +
base64UrlEncode(payload)
→ 서명 알고리즘으로 처리

 

예시

더보기
더보기
{
   { 
      "alg": "HS256",
      "typ": "JWT" 
   },
   {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
   }
}

 

3. 인코딩

  • Header, Payload, Signature를 Base64로 표현한 값
  • 네트워크에서 통신용으로 인코딩값을 사용

 

예시

더보기
더보기
{Base64Url(Header)}.{Base64Url(Payload)}.{Base64Url(Signature)}

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.  // header 
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9. // payload
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ // signature

 

4. 검증 과정

  1. 토큰 수신
    • 요청 헤더: Authorization: Bearer <JWT>
  2. 토큰 분해
    • 인코딩된 JWT를 . 기준으로 세 부분으로 나눔 (Header, Payload, Signature)
  3. 헤더 확인
    • Header를 Base64Url 디코딩하여 읽음
    • 사용된 서명 알고리즘 확인
  4. 서명 검증
    • 서버는 자신이 가지고 있는 비밀키를 사용하여 서명값을 생성함
    • 이 서명값은 위의 Signature 값과 동일해야 무결하다 판단합니다.
  5. 클레임 검증
    • Payload를 Base64Url 디코딩하여 읽음
    • exp 클레임: 토큰 만료 여부
    • role 클레임: 요청에 대한 인가 권한 적절성
    • sub, name 등의 클레임도 필요에 따라 검증될 수 있습니다.
  6. 결과 확인
    • 서명과 모든 클레임이 올바르다면 JWT는 유효하다 판단합니다.
    • 그렇지 않은 경우, JWT는 무효로 간주되어 시스템에서 거부됩니다.

 

 

참고