(JWT)JWT
⁉️ JWT란?
- RFC7519 웹 표준으로 지정
- JSON 객체를 사용해서 토큰 자체에 정보들을 저장하고 있는 Web Token이다.
🔍 JWT의 구성
Header
- Signature를 해싱하기 위한 알고리즘 정보가 담겨있다.
1
2
3
4
{
"alg" : "HS256",
"typ" : "JWT"
}
- alg: 서명 알고리즘 작성
- typ: 토큰 타입을 명시
Payload
- 서버와 클라이언트가 주고받는, 시스템에서 실제로 사용될 정보에 대한 내용들을 담고있다.
1
2
3
4
5
{
"sub" : "1234567890",
"name" : "John Doe",
"admin" : true
}
- 토큰에 담겨져 있는 데이터를 클레임이라고 한다.
클레임 | 타인수락률 |
---|---|
iss(issuer) | JWT를 발행하는 주체를 나타냄 |
sub(subject) | JWT의 주제를 나타냄 |
aud(audience) | JWT발급의 대상자를 나타냄 |
exp(expiration time) | JWT의 만료 날짜/시간을 나타냄 |
nbf(not before) | JWT사용 시작 날짜/시간을 나타냄 |
iat(issued at) | JWT가 발행된 날짜/시간을 나타냄 |
jti(JWT id) | JWT에 대한 고유 식별자로, JWT 복사 방지 |
Signatuer
- 토큰의 유효성 검증을 위한 문자열
- 문자열을 통해 해당 토큰이 유효한 토큰인지를 검증한다.
1
2
3
4
5
HMACSHA256(
base64UrlEncode(header) + "." +,
base64UrlEncode(payload),
Secretkey
)
👀 JWT의 장단점
JWT의 장점
- 중앙의 인증서버, 데이터 스토어에 대한 의존성이 없어, 시스템을 수평적으로 확장하는데 유리하다.
- 사용이 쉽고, 간단하여 사이드 프로젝트에서 사용하기 좋다.
- Base64 URL Safe Encoding > URL, Cookie, Header 모두 사용 가능
JWT의 단점
- Payload의 정보가 많아지면 네트워크 사용량이 증가(트래픽⬆️ ), 데이터의 설계 고려가 필요하다.
- 토큰이 클라이언트에 저장, 서버에서 클라이언트의 토큰을 조작할 수 없다.
🚫 세션과 토큰
세션
- 세션 기반 인증의 기본적인 프로세스
- 서버 측에 클라이언트의 접속 상태를 저장
토큰
- 토큰 기반 인증의 기본적인 프로세스
- 비밀키 또는 공개(개인) 키를 이용해 서명한 토큰을 클라이언트에 전달
- 데이터 요청 시 클라이언트는 토큰을 포함한 상태로 요청을 진행
- 서버는 토큰의 서명 값을 이용해 유효한 토큰인지 검증
세션과 토큰의 차이점
- 정보 포함: 세션 값 자체에는 정보가 포함되어 있지 않다. 하지만, 토큰값에는 정보가 포함되어있다.
- 상태 정보 미저장: 세션 방식은 상태 정보를 서버 내에 저장. 하지만, 토큰은 서버에 클라이언트의 상태를 저장하지 않는 무상태성 방식
- 토큰에는 세션값에 없는 정보를 함께 포함하기 때문에 길이가 길다. -> 정보가 너무 많으면 네트워크 사용량이 증가될 수 있다.
- 토큰 방식을 사용 시 서버에 정보를 저장할 필요가 없다. -> 서버의 확장에 유리하다.
📌 REFERENCE
This post is licensed under CC BY 4.0 by the author.