티스토리 뷰
JWT(Json Web Token)이란?
JWT란 Json Web Token의 약어, Json을 이용하여 사용자 정보(Claims)를 표현하는 Web Token입니다. JWT는 토큰 그 자체가 해당 사용자에 대한 정보로 사용하는 Self-Contained 방식으로 서버와 클라이언트 사이에 전달되어 사용자 인증에 많이 사용되어지고 있는 표준입니다.
JWT 구조
JWT는 Header, Payload, Signature로 구분되며, "." 구분자를 사용하여 구분합니다. 각 부분은 URL-Safe 하게 Base64 Encoding 된 JSON 형태를 가집니다.
위 사진처럼 JWT.IO 사이트를 통해서 더욱 쉽게 살펴보실 수 있습니다.
각 구성요소는 어떠한 정보를 가지고 있는지에 대해서 살펴보도록 하겠습니다.
헤더(Header)
토큰의 헤더는 아래와 같이 크게 alg과 typ 2개의 정보로 구성되어있습니다.
{
"alg": "HS256",
"typ": JWT
}
- alg : 토큰 서명(Signature)에 사용한 알고리즘을 의미합니다. e.g) HS256, RSA,...
- typ : 해당 토큰의 타입을 의미합니다. e.g) JWT,...
페이로드(payload)
페이로드는 말 그대로 토큰에 담고자 한 정보들을 의미합니다. 이러한 정보들을 각각 클레임(Claim)이라고 부르며, 이러한 클레임(Claim)은 크게 등록된 클레임, 공개 클레임, 비공개 클레임으로 구분됩니다.
등록된 클레임
등록된 클레임은 모두 필수 값이 아닌 선택 값입니다.
클레임 명 | 설명 | 비고 |
iss(issuer) | 토큰을 발행한 주체에 대한 정보 | |
sub(subject) | 토큰의 제목, Unique한 값을 주로 사용합니다. | |
aud(audience) | 토큰 대상자입니다. | |
exp(expiration) | 토큰이 만료되는 시간입니다. | Numeric한 날짜형식이여야하며, 현재보다 이후여야합니다. |
nbf(not before) | 토큰이 활성화되는 날짜입니다. | 해당 일 이전에는 토큰이 활성화되지 않으며, exp 클레임과 동일하게 Nuemric한 날짜형식이여야합니다. |
iat(issued at) | 토큰이 발급된 시간입니다. | |
jti(jwt id) | JWT 고유 식별자입니다. |
공개 클레임(사용자 정의 클레임)
공개 클레임은 충돌 방지(Collision-Resistant)하여야 하며, 충돌되지 않도록 아래와 같이 일반적으로 URI 포맷을 사용합니다.
{
"https://jongwoon.tistory.com" : true
}
비공개 클레임(사용자 정의 클레임)
아래와 같이 클라이언트와 서버 사이에서 정의하여 사용할 정보(Claim)입니다. 보안상 취약할 수 있는 사용자 개인 정보는 담지 않은 것이 좋으며, 최소한의 정보를 담는 것이 좋습니다.
{
"user_name" : "jongwoon"
"age" : 100
}
서명(Signature)
서명(Signature)은 해당 토큰이 올바르게 생성되었는지를 위한 서명을 위하여 생성된 HMAC입니다. HMAC 부분을 이용하여 토큰이 유효한 토큰인지 확인할 수 있습니다. 서명은 헤더와 페이로드를 각각 base64 UrlEcnode 후, 구분자 "."로 연결한 후, 시크릿 키를 기반으로 생성된 HMAC입니다.
일반적으로 비공개 시크릿 키(비공개키)를 사용하여 서명되며, 공개(Public-Private) 키를 사용하여 서명되어질 수도 있습니다.
JWT의 장점
- Stateless 하고 Self-Contained 하기 때문에, 분산 마이크로 서비스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 및 인가 방법을 제공합니다. 따라서 MSA 환경에서 더욱 빛을 보고 있습니다.
JWT의 단점
- Payload, Self-Contained 하여, 토큰 자체에 정보를 담고 있으므로, 보안상 취약할 수 있기 때문에 Claim에는 최소한의 정보만을 담는 것이 좋습니다. 중요한 정보는 해당 사용자를 식별할 수 있는 식별자로 추가적으로 서버에 요청하여 사용하는 방법이 좋습니다.
- 토큰의 페이로드에 저장되는 정보(Claim)에 대한 제약사항이 없기 때문에, 많은 정보를 담게 될 경우 JWT는 매 서버와 클라이언트 Request에 담겨 전송되기 때문에 많은 네트워크 자원을 소모할 수 있습니다.
- Stateless: 한번 생성된 토큰을 만료시킬 방법이 존재하지 않기때문에, 위에서 살펴보았듯이 토큰의 만료시간 등을 지정하는 것이 좋습니다.
- 이렇게 생성된 토큰은 브라우저에 쿠키 또는 로컬 스토리지로 관리되기때문에, 보안에 취약할 수 있습니다.
참고 문헌
- Total
- Today
- Yesterday
- sql
- 회고
- 알고리즘
- 오늘의집
- 코드 스니펫
- 코딩인터뷰
- k8s
- dsu
- 해쉬
- dfs
- BFS
- 정렬
- 쓰레드
- 탐욕법
- Java
- 스택
- 연결리스트
- 프로그래머스
- kotlin
- 스트림
- JPA
- 문자열
- set
- 카카오
- Uber
- TDD
- 우선순위큐
- dp
- 구현
- 비트연산
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |