0. 이 글을 작성하는 이유
JWT에 대해 정말 엄청 겉핥기로만 알고 있어서 이번에 프로젝트에 적용을 하기 위해 알아본 내용을 정리하기 위함
1. JWT란?
Json Web Token의 약자이다. 이름에서 유추해 보면 Json형태로 된 Web에서 사용하는 Token이다.
우리는 이 Token을 가지고 인증 / 인가에 대한 처리를 할 수 있다.
2. JWT 구성
JWT는 크게 헤더(JOSE Header), 페이로드(JWS Payload), 서명(JWS Signature) 3가지 파트로 구성된다.
2-1. 헤더(JOSE Header)
JOSE라는 단어가 생소하게 느껴질 수 있다. JOSE는 Javascript Object Signing and Encryption의 약자로 간략하게 설명하면 claim(payload)를 안전하게 전송하는 방법을 제공하기 위한 프레임워크이다.
헤더에는 alg와 typ이라는 2가지 정보가 들어간다.
alg : 암호화 방식 (algorithm)
typ : 데이터 타입 (type)
JWT를 사용하는 입장에서는 typ에는 "JWT"가 들어간다.
HS256 알고리즘을 사용하는 JWT의 헤더는 아래와 같이 작성된다.
{
"alg": "HS256",
"typ": "JWT"
}
2-2. 페이로드 (JWS payload)
JWS는 Json Web Signature의 약자이다.
JSON형식으로 디지털 서명 또는 메시지 인증 코드(MAC)로 보안된 콘텐츠를 의미한다.
페이로드는 Claim의 모음이다. Claim이란 정보의 단위이다. 아래 예제를 보자.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
여기서는 sub, name, admin이라는 3개의 Claim이 존재한다.
Claim에는 Registrered, Public, Private(Custom) 3가지 종류가 있다.
2-2-1. Registered Claim
Registered Claim에는 사전에 정해진 7가지가 있다.
- 필수 Claim
- exp(expiration time) : 토큰 만료 시간
- OPTIONAL(넣어도 되고 안넣어도 되고) Claim
- iss(issuer / OPTIONAL) : 토큰 발급자
- sub(subject / OPTIONAL): 토큰 제목
- aud(audience / OPTIONAL): 토큰 수신자/대상자
- nbf(not before / OPTIONAL): 토큰의 활성 날짜
- iat(issued at / OPTIONAL): 토큰이 발급된 시간이다. 토큰이 얼마나 지났는지 확인할 수 있다. NumericDate 값을 포함해야 한다.
- jti(jwt id / OPTIONAL): JWT에 대한 고유 식별자이다. 토큰의 중복에 대한 처리에 사용할 수 있다.
2-2-2. Public Claim
공개 클레임으로 JWT를 사용하는 사용자가 원하는 대로 정의할 수 있다. 그러나 충돌을 방지하려면 IANA Json Web Token Registry에 정의하거나 충돌 방지 네임스페이스를 포함하는 URI로 정의해야 한다.
2-2-3. Private(Custom) Claim
당사자들 간에 정보를 공유하기 위해 만들어진 custom claim이다. Public claims과는 달리 이름이 중복되어 충돌 가능성이 있다.
2-3. 서명 (JWS signature)
서명 (JWS signature)은 토큰이 신뢰할 수 있고 변조되지 않았는지 확인하는 데 사용된다. JWT를 사용할 때는 저장 및 사용하기 전에 서명을 확인해야 한다.
참고
https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-token-claims
https://datatracker.ietf.org/doc/html/rfc7519#section-4
https://doqtqu.tistory.com/275
'컴퓨터공학 > 네트워크' 카테고리의 다른 글
WebSocket (0) | 2023.11.12 |
---|---|
유효 기간이 있는 메일 인증은 어떤 방식으로 이루어질까 (0) | 2023.10.02 |
HTTPS (0) | 2023.09.28 |