목차
1. JWT 란?
2. JWT 구성요소
3. JWT 장단점
4. JWT 인증 방식
5. Access Token / Refresh Token
JWT 란?
JWT는 "JSON Web Token"의 약자로,
웹 및 애플리케이션 간에 정보를 안전하게 전송하기 위한 표준화된 방법 중 하나입니다.
JWT는 클레임(claim) 기반의 토큰이며, 토큰 안에는 JSON 형식으로 데이터가 포함되어 있습니다.
이 토큰은 서버와 클라이언트 간의 정보 교환에 사용되며, 주로 사용자 인증 및 권한 부여에 활용됩니다.
JWT 구조
JWT 는 Header, Payload, Signature 세 부분으로 구성되어있으며,
각 부분은 . 을 기준으로 나누어져 있으며,
Json 형태로 Base64 URL 인코딩 되어 있습니다.
Encoded 좌측부터 Header, Payload, Signature 입니다.
Header
토큰의 유형 및 해싱 알고리즘 등의 메타데이터를 담고 있습니다.
{
alg : 서명 암호화 알고리즘(ex: HMAC SHA256, RSA)
typ : 토큰 유형
}
Payload
실제로 전송하려는 정보를 포함하고 있습니다.
Payload 는 세 가지 유형으로 나뉩니다.
1. 등록된 클레임(Registered Claims) : 토큰에 대한 몇 가지 표준 클레임으로, 선택적으로 사용할 수 있습니다.
iss (issuer: 발행자)
iss(issuer; 발행자),
exp(expireation time; 만료 시간),
sub(subject; 제목),
iat(issued At; 발행 시간),
jti(JWI ID)
2. 공개 클레임(Public Claims) : 사용자 정의 클레임으로, 서버와 클라이언트 간 협의된 데이터를 담습니다.
3. 비공개 클레임(Private Claims) : 서버와 클라이언트 간에 협의된 비밀 정보를 담습니다.
Signature
토큰의 유효성을 검증하기 위한 서명이 포함되어 있습니다.
서명은 헤더와 클레임, 비밀 키를 사용하여 생성됩니다.
Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만,
Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.
따라서 Signature는 토큰의 위변조 여부를 확인하는데 사용된다.
JWT 장단점
JWT 장점
- Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다.
- 인증 정보에 대한 별도의 저장소가 필요없다.
- JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증됬음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있다.
- 클라이언트 인증 정보를 저장하는 세션과 다르게, 서버는 무상태(StateLess)가 되어 서버 확장성이 우수해질 수 있다.
- 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다. ( 쿠기와 차이 )
- OAuth의 경우 Facebook, Google 등 소셜 계정을 이용하여 다른 웹서비스에서도 로그인을 할 수 있다.
모바일 어플리케이션 환경에서도 잘 동작한다. ( 모바일은 세션 사용 불가능 )
JWT 단점
- Self-contained : 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
- 토큰 길이 : 토큰의 Payload에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
- Payload 인코딩 : payload 자체는 암호화 된 것이 아니라 BASE64로 인코딩 된 것이기 때문에, 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, payload에 중요 데이터를 넣지 않아야 한다.
- Store Token : stateless 특징을 가지기 때문에, 토큰은 클라이언트 측에서 관리하고 저장한다.
때문에 토큰 자체를 탈취당하면 대처하기가 어렵게 된다.
JWT 인증 방식
유저 서버
1. 사용자가 로그인 시도
→
2. 로그인 성공시 JWT 발행
←
3. JWT 를 사용하여 API 요청
→
4. 토큰에 이상이 없으면 요청 응답
←
5. 토큰 만료 또는 이상 시 리프레시 토큰으로 토큰 재발급
Access Token / Refresh Token
JWT 는 제 3자에게 탈취 위험성이 있기 때문에 그대로 사용하지 않고,
Access Token, Refresh Token 으로 이중으로 나누어 인증을 하는 방식 취한다.
Access Token 과 Refresh Token 은 둘다 JWT이다.
Access Token 은 클라이언트가 가지고 있으며, Refresh Token 은 데이터베이스에 저장한다.