JWT(Json Web Token) 란
JWT는 Json(key & value) 형식을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.
JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 암호화하여 토큰에 담아 전달한다.
Claim 기반
Claim 이란 사용자에 대한 정보나 속성을 말하며 name & value 형식으로 구성된다.
JWT는 독립적이다
JWT는 독립적(Self-contained)이라고 표현하기도 한다.
Payload 안에 사용자에 대한 정보가 들어있으므로 데이터베이스 조회 작업이 줄어든다.
하지만 이러한 특성 때문에 Payload에 암호화되지 않은 데이터가 노출되는 JWS 방식의 경우
민감한 정보는 넣지 않는 것이 바람직하다.
JWT, JWS, JWE 구분
JWT
JWT는 인터페이스 역할을 해주는 추상적인 개념이고 실제 구현은 JWS와 JWE로 나누어진다.
JWS
디지털 서명을 하는 방식은 JWS(JSON Web Signature)
JWE
암호화 하는 방식은 JWE(JSON Web Encryption)
JWT 구조
JWT는 Header, Payload, Signature의 3 부분으로 이루어지며 Json 형태인 각 부분은 Base64Url로 인코딩 되어 표현된다.
각각의 부분은 ". "구분자를 사용하여 구분한다.
추가로 Base64Url은 암호화된 문자열이 아니므로 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다.
1. Header
- alg: Secret Key 를 암호화 할 알고리즘 방식을 지정하며 Signature 및 토큰 검증에 사용
ex) HS256(SHA256) 또는 RSA - typ: 토큰의 타입을 지정
ex) JWT
{
"alg": "HS256",
"typ": JWT
}
2. Payload
토큰의 Payload에는 토큰에서 사용할 정보의 조각들인 Claim이 담겨 있다.
Claim은 총 registered, public, private 의 3가지로 나누어지며, Json(Key & Value) 형태로 다수의 정보를 넣을 수 있다.
ㄴ 1. Registerd
Registerd Claim은 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터들이다.
모두 선택적으로 작성이 가능하며 사용할 것을 권장한다. JWT를 간결하게 하기 위해 key는 모두 길이 3의 String이다.
여기서 subject로는 unique한 값을 사용하며, 주로 사용자 이메일을 사용한다.
- iss: 토큰 발급자(issuer)
- sub: 토큰 제목(subject)
- aud: 토큰 대상자(audience)
- exp: 토큰 만료 시간(expiration), NumericDate 형식으로 되어 있어야 함
ex) 1480849147370 - nbf: 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화되지 않음
- iat: 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간을 알 수 있음
- jti: JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Token) 등에 사용
ㄴ 2. Public
Public Claim은 사용자 정의 클레임으로 공개용 정보를 위해 사용된다.
충돌 방지를 위해 URI 포맷을 이용하며 예시는 아래와 같다.
{
"https://mangkyu.tistory.com": true
}
ㄴ 3. Private
Private Claim은 사용자 정의 클레임으로 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다.
예시는 아래와 같다.
{
"token_type": access
}
3. Signature
Signature는 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
Signature를 생성하는 과정은 아래와 같다.
- 위에서 만든 Header와 Payload의 값을 각각 BASE64Url로 인코딩한다.
- 인코딩한 값을 Secret Key를 이용해 Header에서 정의한 알고리즘으로 해싱한다.
- 이 값을 다시 BASE64Url로 인코딩하여 생성한다.
JWT 토큰 예시
완성된 JWT 의 형식은 아래와 같다.
Header(base64Url 인코딩).Payload(base64Url 인코딩).secretKey(Header의 알고리즘으로 암호화 후 base64Url인코딩)
생성된 토큰은 HTTP 통신을 할 때 Authorization이라는 key의 value로 사용된다.
일반적으로 value에는 Bearer이 앞에 붙여지며 예시는 아래와 같다.
{
"Authorization": "Bearer {생성된 토큰 값}"
}
JWT 단점 및 고려사항
- Self-contained: 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
- 토큰 길이: 토큰의 Payload에 3종류의 Clain을 저장하므로 정보가 많아질수록 토큰의 길이가 늘어나
네트워크에 부하를 줄 수 있다. - Payload 인코딩: Payload 자체는 암호화 된 것이 아니라 BASE64Url로 인코딩 된 것이다.
중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로 JWE로 암호화하거나
Payload에 중요 데이터를 넣지 않아야 한다. - Stateless: JWT는 상태를 저장하지 않기 때문에 한번 만들어지면 제어가 불가능하다.
즉, 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어주어야 한다. - Store Token: 토큰은 클라이언트 측에서 관리해야 하기 때문에 토큰을 저장해야 한다.
관련글
참고자료)
[Server] JWT(Json Web Token)란?
현대 웹서비스에서는 토큰을 사용하여 사용자들의 인증 작업을 처리하는 것이 가장 좋은 방법이다. 이번에는 토큰 기반의 인증 시스템에서 주로 사용하는 JWT(Json Web Token)에 대해 알아보도록 하
mangkyu.tistory.com
JWT(JSON Web Token) 알아보기
JWT의 구조를 알아보자! JWS와 JWE도 간단히 살펴본다.
velog.io
'네트워크' 카테고리의 다른 글
[네트워크] CORS (0) | 2023.12.02 |
---|---|
x-www-form-urlencoded와 json (0) | 2023.09.21 |
[네트워크] HTTP 요청 데이터 (0) | 2023.07.25 |
웹 서버(WS)와 WAS 및 분리 이유 (0) | 2023.04.03 |
[네트워크] REST API 란? (0) | 2023.03.27 |