JWT에 대해서 정말 많이 들어보고 사용하고 있지만, 모르는 부분이 많을 것으로 생각되어 글로 한번 정리를 해보고자 한다.
JWT(Json Web Token)
은 웹에서 사용하는 JSON
형식의 토큰에 대한 표준 규격으로 사용자 인증(authentication)
, 인가(authorization)
정보를 서버, 클라이언트간에 주고 받기 위해 사용한다.
사진과 같이 해더(header), 페이로드(payload), 서명(signature)로 나누어지며 각 구역은 .
기호를 통해 구분된다.
토큰의 유형과 서명 알고리즘에 명시
Claim 이라 불리는 사용자의 인증/인가 정보
노출과 수정이 가능한 지점이기에 인증에 필요한 최소한의 정보만을 담아야 한다.
해더와 페이로드가 비밀키로 서명되어 저장
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Indvb2ppbiIsImlhdCI6MTUxNjIzOTAyMn0.GXtEgp14wdK51xxRnSwSop5N7E4nCiFmw7v7HjmWIF8
다음과 같은 JWT를 한번 Decode해서 확인해보면
이렇게 해더
와 페이로드
를 확인 할 수 있다.
JWT
에서 자주 사용하는 JSON키 이름은 다음과 같다.
sub
: 키 인증 주체(subject)iss
: 키 인증 발급처typ
: 토큰의 유형(type)alg
: 서명 알고리즘(algorithm)iat
: 발급 시각(issued at)exp
: 만료 시작(expiration time)JWT등장 이전에는 쿠키
, 세션
을 이용한 사용자 인증을 많이 사용했지만 JWT 등장 이후에는 JWT
를 많이 사용하는데 이는
확장성
에 가장 큰 이유가 있다. JWT는 토큰 자체에 사용자의 정보가 저장되어 서버 입장에서는 토큰만 검증해주면 된다.
따라서 JWT를 사용할 때는 사용자가 늘더라도 사용자 인증을 위해서 추가로 투자해야하는 인프라 비용 절감 장점이 있다.
규모가 있는 서비스에서 사용자 인증 용도로 JWT를 사용하기에는 한계가 있다. 예를들면 현재 로그인된 사용자 정보를 제공하거나, 특정 기기에서의 로그인 같은 기능은 구현하기가 어려운 것이다.
JWT
데이터는 누구나 쉽게 풀어서 열람이 가능하기에, 민감한 사용한 정보를 토큰에 저장하면 큰 보안 문제가 될 수 있어 이부분에 대해서 주의가 필요하다.