CS

JWT (JSON Web Token)

감자b 2024. 12. 26. 00:21

JWT란

JSON 객체를 이용해 당사자 간에 안전하게 정보를 전송하기 위해 만들어진 것으로, 인증에 필요한 정보를 암호화하여 담은 토큰을 의미한다.

 

JWT의 구성 요소

 

Header

{
  "alg": "HS256",
  "typ": "JWT"
}

헤더는 서명 알고리즘의 종류(HMAC SHA256 또는 RSA)와 토큰 유형이 담겨져 있다.

 

Payload

{
  "sub": "1234567890",
  "name": "hyeon",
  "iat": 1516239022
}

클레임(전달하려는 정보)이 담겨져 있는 부분으로 시스템에서 실제로 사용되는 정보에 대한 내용을 의미한다.

이 부분은 수정이 가능하고 노출이 가능하므로 ID와 비밀번호와 같은 개인 정보가 아닌 토큰의 만료 기간이나 발급 시간 등을 담아야 한다.

추가로 Payload에 들어갈 수 있는 클레임의 종류는 3가지로 분류 된다.

  • Registered claims(등록 클레임)
    • 미리 정의가 되어있는 클레임 세트로 다음과 같이 구성되어 있다.
    • iss(발행인)
    • exp(만료 시간 NumericDate 형식)
    • sub(제목)
    • aud(대상자)
    • iat(발급 시간)
    • jti(토큰 식별자)
  • Public claims(공개 클레임)
    • 사용자가 정의할 수 있는 클레임으로 충돌을 방지하기 위하여 URI로 정의되어야 한다.
  • Private claims(비공개 클레임)
    • 클라이언트와 서버 간 정보를 공유하기 위해 생성된 클레임으로 양측 간 협의 하에 임의로 지정된 정보를 저장한다.

signature

토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드를 의미한다.

헤더와 페이로드를 각각 BASE64로 인코딩하고, 이 값을 서버가 가지고 있는 비밀 키를 이용해 헤더에서 정의한 알고리즘(alg)으로 해싱 후 다시 BASE64로 인코딩한다.

 

완성된 JWT 토큰 예시 (https://jwt.io/#debugger-io)


JWT의 인증 과정

JWT 전송 방법

Authorization: Bearer <token>