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>