경계의 경계

JWT란 무엇인가 본문

Spring Security

JWT란 무엇인가

gigyesik 2024. 4. 27. 17:36

들어가며

Spring Security를 사용하면 API에 사용되는 인증, 인가에 JWT를 사용할 수 있다.

JWT 라이브러리는 API 엔드포인트에 JWT 필터를 추가하고, 필터는 헤더에 들어있는 JWT 토큰을 검증하여 유효하면 Security Context에 등록한다.

JWT란 무엇인가

JWT(JSON Web Token)란 인터넷 표준(RFC 7519)으로, 데이터의 안전한 전송방법에 대한 정의이다.

토큰의 claim을 JSON 객체로 암호화하고 비공개 암호 또는 공개, 비공개 키 쌍을 통해 디지털 서명하여 발급할 수 있다.

JWT는 인증 정보 교환 뿐 아니라 세션 관리나 In-Memory 정보 관리에도 활용될 수 있으므로, OAuth2와 같은 제3자 서버와의 인증에도 사용될 수 있다.

JWT의 구성요소

JWT는 [Header].[Payload].[Signature] 로 이루어지는 3개의 구성요소를 가지고 있다.

  • Header : 헤더에는 서명 기술 정보나 메타데이터 등 JWT의 암호화 처리 정보가 들어있다.
    • base64URL JSON 객체로 인코딩되어있다.
    • { "alg": "HS256", "typ": "JWT" }
  • Payload : 페이로드는 토큰을 통해 실제 전달되는 데이터가 들어있다. 이를 ‘claims’이라 부른다.
    • claims 는 registerd, public, private 세 종류가 있다.
    • registered claims는 기본값으로 들어있는 정보이다. iss(issur), sub(subject), aud(audience) 등이 있다.
    • public claims는 JWT가 정의한 데이터들이다.
    • private claims는 발행자가 토큰 정보 활용 목적으로 정의한 데이터들이다.
    • { "sub": "1234", "name": "gigyesik", "admin": true }
  • Signiture : 토큰의 메시지가 변조되지 않았음을 서명하는 역할을 한다.
    • 비공개 키로 서명된 토큰은 발행자를 인증한다.
    • 토큰 데이터와 함께 암호화된다.
    • HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
  • Header + Payload + Signiture 가 암호화된 토큰의 형태는 아래와 같다.
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6I
kpvaG4gRG9lIiwiYWRtaW4iOmZhbHNlfQ.gWDlJdpCTIHVYKkJSfAVNUn0ZkAjMxskDDm-5Fhe
WJ7xXgW8k5CllcGk4C9qPrfa1GdqfBrbX_1x1E39JY8BYLobAfAg1fs_Ky8Z7U1oCl6HL63yJq_
wVNBHp49hWzg3-ERxkqiuTv0tIuDOasIdZ5FtBdtIP5LM9Oc1tsuMXQXCGR8GqGf1Hl2qv8MCyn
NZJuVdJKO_L3WGBJouaTpK1u2SEleVFGI2HFvrX_jS2ySzDxoO9KjbydK0LNv_zOI7kWv-gAmA
j-v0mHdJrLbxD7LcZJEGRScCSyITzo6Z59_jG_97oNLFgBKJbh12nvvPibHpUYWmZuHkoGvuy5RLUA

Resources