JWT란?
JWT(Json Web Token)의 줄임말 으로써,
정보를 비밀리에 전달하거나, 인증할때 주로 사용하는 토큰으로, Json객체를 이용한다.
클라이언트와 서버사이에서 통신할 때 권한을 위해 사용하는 토큰이다.
웹에서 정보를 Json형태로 주고 받기 위해
표준규약에 따라 복잡하고 읽을수 없는 String형태로 생성한 암호화된 토큰으로 통신을한다.
구성요소
header , payload , signature 세 파트로 나뉘어져 구성되어있다.
- 헤더(header)
어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것 인지에 대한 정보가 들어있다. - 정보(payload)
전달하려는 정보(사용자 id나 데이터들 이것들을 클레임이라고도 부른다)가 들어있다.
정보는 수정이 가능하여 더 많은 정보를 추가할 수 있다.
노출과 수정이 가능하여 최소한의 정보(개인정보가 아닌 토큰을 가졌을 때 권한의 범위나 발급일,만료일자 등)만을 담아야한다. - 서명(signture)
가장 중요한 부분이다.
헤더와 정보를 합친 후 발급해준 서버가 지정한 시크릿 키로 암호화 시켜 토큰을 변조하기어렵게 만들어준다.
토큰이 발급된 후 누군가가 payload의 정보를 수정하면 payload에는 다른 누군가가 조작된 정보가 들어가 있지만
signature에는 수정되기 전에 payload 내용을 기반으로 이미 암호화 되어있는 결과가 저장되어 있기 때문에
조작되어있는 payload와는 다른 결과값이 나온다.
이러한 방식으로 비교를통해 서버는 토큰이 조작되어있는지, 아닌지를 판별하고
조작된 토큰으로 악용하기가 어려워진다.
전형적인 JWT 토큰의 디버깅 결과
//헤더
{
"alg" : "HS256",
"typ" : "JWT"
}
//페이로드
{
"sub" : "1234567890",
"lat" : 1516239022
}
JWT에서 자주 사용되는 JSON 키 이름.
- sub 키 : 인증 주체(subject)
- iss 키 : 토큰 발급처
- typ 키 : 토큰의 유형(type)
- alg 키 : 서명 알고리즘(algorithm)
- iat 키 : 발급 시각(issued at)
- exp 키 : 말료 시작(expiration time)
- aud 키 : 클라이언트(audience)
JWT를 통한 인증/인가
JWT는 실무에서 OAuth나 OIDC 프로토콜과 함께 API의 인증 이나 인가를 위해서 주로 사용이 된다.
보통 클라이언트가 어떤 서비스의 인가 서버를 통해 로그인에 성공하면 JWT 토큰을 획득할 수 있다.
그러면, 클라이언트는 해당 서비스의 API를 호출할 때 JWT 토큰을 보내서 원하는 자원에
접근하거나 허용된 작업을 수행할 수 있다.
OAuth 와 OIDC 참고블로그
- OAuth
- OIDC
JWT의 장점
JWT가 등장하기 전에는 웹에서 쿠키와 세션을 이용하여 사용자인증을 하는 경우가 많았다.
쿠키와 세션을 사용할 때는 서버에 로그인한 모든 사용자의 세션을 DB나 캐시에 저장해놓고
쿠키로 넘어온 세션 ID로 사용자 데이터를 매번 조회해야하기때문에 번거롭지만
JWT는 토큰 자체에 사용자 정보가 저장되어 있기 때문에 서버 입장에서 토큰을 검증만 해주면 된다.
따라서 JWT를 사용할 때는 사용자가 증가하더라도 사용자 인증을 위해서 추가로 투자해야하는
비용을 크게 절감할 수 있습니다.
뿐만 아니라 쿠키를 사용하지 않으므로 CORS 문제에서 자유로워질수 있다는 장점도 있다.
CORS 정리글 참고
- CORS 와 SOP란?
JWT의 한계 및 단점
어느 정도 규모가 있는 서비스에서 사용자 인증 용도로 JWT를 사용하기에는 부족한 경우가 있다.
예를 들어, 현재 로그인된 사용자의 모든 장비들을 나열해주거나, 특정 장비에서 로그아웃을 허용하는 기능을 구현하려면
서버에 사용자 세션을 저장하지 않고는 어렵기 때문입니다.
JWT란 무엇인가?
JWT(Json Web Token) > 정보를 비밀리에 전달하거나 인증할 때 주로 사용하는 토큰으로, Json객체를 이용함 JWT는 Json Web Token의 약자로 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해
velog.io
JWT - Json Web Token
Engineering Blog by Dale Seo
www.daleseo.com