JWT는 객체간에 정보를 전달하거나 권한을 부여할 때 사용하는 토큰이다.
JWT의 signature 정보를 이용해 데이터 조작을 방지할 수 있어 안전하게 정보를 전달할 수 있다.
회원이 로그인을 하면 서버는 회원 정보가 담긴 토큰을 발급해 준다.
회원이 서버에 데이터를 요청할 때마다 발급받은 토큰 정보를 함께 전달한다.
서버는 클라이언트에게 요청을 받을 때마다 해당 토큰이 유효하고 인증됐는지 검증하며, 유저가 요청한 작업에 대한 권한이 있는지 여부를 확인하여 처리한다.
JWT를 사용하면 요청이 들어왔을 때 토큰만 확인하면 되기 때문에 유저의 세션을 서버에 유지할 필요가 없다. 따라서 서버 자원이 절약된다.
JWT는 인터페이스 역할을 하는 추상적인 개념이고, 이에 대한 구현은 그 방식에 따라 JWS와 JWE로 나누어진다.
(뒤에 설명해 두었지만, claim은 JWT 내부의 각 정보들을 나타내는 단위이다.)
JWS(JSON Web Signature)
claim에 디지털 서명을 하여 사용하는 방식이다.
claim의 내용이 노출되지만, 서명을 이용하여 원본이 맞는지 무결성 검증을 할 수 있다.
JWE(JSON Web Encryption)
claim을 암호화하여 사용하는 방식이다.
JWS와는 달리 claim 자체를 암호화시키므로 내용이 노출되지 않는다.
보안의 측면에서는 JWE가 뛰어나지만, JWE를 사용하면 클라이언트가 claim의 데이터를 사용할 수 없다. 클라이언트가 claim의 데이터를 사용하려면 JWS 방식을 사용해야 하기 때문에, 일반적으로 JWT라고 하면 JWS를 가리킨다.
JWT는 Header, Payload, Signature로 이루어져 있다.