Spring/Spring Security

[JWT] 1. JWT Token

noahkim_ 2023. 10. 3. 01:44

1. JWT

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

 

특징

경량성
  • 간결하고 크기가 작음
  • 제약된 환경에서 정보를 간단하게 전달하는데 사용됨

 

보안성
  • 서명된 토큰
    • 무결성 보장: 정보가 위조되지 않았음을 검증할 수 있음
    • Algorithm: HMAC, RSA 
  • 데이터 암호화 가능 (민감데이터 보호)

 

자급자족
  • 필요한 정보를 자체적으로 포함하고 있음
    • 서버측에서 별도의 상태를 유지할 필요가 없음
  • 서버는 토큰의 클레임 정보를 통해 별도의 데이터베이스 조회 없이 요청을 처리할 수 있음

 

2. 구성

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

header

  • 토큰의 메타데이터

 

alg
  • 서명할 떄 사용한 알고리즘
  • HS256: HMAC using SHA-256 (대칭키)
  • RS256: RSASSA-PKCS1-v1_5 using SHA-256 (비대칭키)
  • ES256: ECDSA using SHA-256 and P-256 (비대칭키)

 

typ
  • 토큰의 타입
  • JWT 사용시, "JWT"로 설정됨

 

payload

  • 토큰에서 포함된 정보 조각

 

claim
  • 데이터 쌍 (토큰 발행자, 만료 시간, 주제, 사용자 권한 등)
  • Registered Claims: 정의된 클레임 (JWT 스펙 정의 O)(iss, exp, sub, aud)
  • Public Claims: 정의된 클레임 (JWT 스펙 정의 X)  
  • Private Claims: 사용자 정의 클레임 (JWT 스펙 정의 X)  

 

signature

  • 토큰의 서명 정보
  • JWS를 사용하여 서명 (서명을 생성하기 위해 사용하는 기술)

 

무결성 보장
  • 전송 중 변경되지 않았음을 보장함
  • 수신자는 서명을 검증하여 위조 여부 확인 가능

 

서명 과정
  1. 헤더 & 페이로드 인코딩 (Base64Url)
  2. 서명: 인코딩된 헤더와 페이로드 조합 + 서명 알고리즘(비밀키 사용)
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

 

4. 인코딩

{Base64Url(Header)}.{Base64Url(Payload)}.{Base64Url(Signature)}

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.  // header 
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9. // payload
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ // signature
  • Header, Payload, Signature를 Base64로 표현한 값

 

5. 검증 과정

토큰 수신
토큰 분해
  • 인코딩된 토큰을 Header, Payload, Signature 세 부분으로 나눕니다

 

헤더 확인
  • Header를 Base64Url 디코딩하여 읽음

 

서명 검증
  • 서버는 자신이 가지고 있는 비밀키를 사용하여 HMACSHA256 해시를 생성합니다. (Header와 Payload의 조합)
  • 이 해시값은 위의 Signature 값과 동일해야 무결하다 판단합니다.

 

클레임 검증
  • Payload를 Base64Url 디코딩하여 읽음
  • exp 클레임: 토큰 만료 여부
  • role 클레임: 요청에 대한 인가 권한 적절성
  • sub, name 등의 클레임도 필요에 따라 검증될 수 있습니다.

 

결과 확인
  • 서명과 모든 클레임이 올바르다면 JWT는 유효하다 판단합니다.
  • 그렇지 않은 경우, JWT는 무효로 간주되어 시스템에서 거부됩니다.

 

 

참고