JWT(JSON Web Token)란?
- JWT는 웹표준 (RFC 7519)으로 두 개체 사이에 JSON 객체를 사용하여 가볍고 독립적인 (self-contained) 방식으로 정보를 안전성 있게 전달해준다.
- 전자식 서명으로 되어있기 때문에 신뢰있고 검증된 정보라고 할 수 있다.
- URL, Cookie, Header와 같이 사용할 수 있는 문자가 제한된 환경에서 정보를 주고받을 수도 있다.
- 필요한 모든 정보를 자체적으로 지니고 있다.
- 토큰에 대한 기본정보(생성 날짜, 만료 날짜...), 전달할 정보(로그인 유저 정보..) 등
JWT를 사용하는 이유
Stateless
- HTTP의 특징 Stateless, Rest의 특징도 Stateless다. 세션을 서버에 저장하고 이를 HTTP 프로토콜로 전송하게 될 경우에는, Stateful한 통신을 하게 된다. 이는 서버에서 세션을 관리해야하여 해당 세션을 통해 회원을 조회하는 로직이 발생하여 서버의 응답시간도 늘어날 뿐더러, 다중 서버일 경우에는 각 세션 관리에 대한 고민도 해야한다. JWT 토큰을 사용할 경우에는 모든 정보가 암호화되어 토큰에 저장되기 때문에 이러한 고민을 할 필요가 없어지게 되고, 암호화 키를 통해서 해당 토큰이 유효한지만 확인을 하면 되기 때문에, Stateless한 통신을 할 수 있게 된다.
Authorization
- 로그인을 하면, 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달한다. 그 후, 유저가 서버에 요청을 할 때 마다 JWT를 포함하여 전달합니다. 서버가 클라이언트에서 요청을 받을때 마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 유저가 요청한 작업에 권한이 있는지 확인하여 작업을 처리한다.
- 서버측에서는 세션을 유지 할 필요가 없어진다. 즉 유저가 로그인되어있는지 안되어있는지 신경 쓸 필요가 없고, 유저가 요청을 했을때 토큰만 확인하면 되므로 세션 관리가 필요 없어서 서버 자원과 비용을 절감할 수 있다.
Information Exchange
- 공개키/비밀키 등을 사용하여 서명되어 있기 때문에 송신자(sender)가 누구인지 알 수 있으며, 이로 인해 안전하게 정보들을 교환할 수 있다. 또한, 서명은 헤더와 페이로드를 사용하여 산출되기 때문에 해당 내용이 조작되지 않았다는 것을 증명할수도 있다.
JWT 사용 시 고려해야할 사항
토큰의 길이
- Claim에 넣는 데이터가 많아질수록, JWT 토큰의 길이가 길어진다. 일반적으로 많은 API 요청 시 토큰뿐만 아니라 다른 여러 데이터도 담아서 보내게 되는데, API 매 호출마다 길이가 긴 토큰을 보낸다는 것은 더 큰 데이터를 보내 네트워크 전송량이 많아지게 된다는 것을 의미하게 된다. 또한 헤더에 담아 보내게 될텐데 헤더의 길이를 초과하게 되는 상황이 발생할 수도 있다.
구성
HEADER.PAYLOAD.SIGNATURE
헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분을 점(.)으로 구분하는 구조
Header
- Signature를 해싱하기 위한 알고리즘 정보