인증에 필요한 정보들을 암호화시킨 JSON 토큰
JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다.
JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다. 따라서 사용자가 JWT 를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다.
JWT는 . 을 구분자로 나누어지는 Header, Payload, Signature 세 가지 문자열의 조합이다.
Header 에는 JWT 에서 사용할 타입과 해시 알고리즘의 종류와 토큰 유형이 담긴다.
Payload에는 서버와 클라이언트가 주고받는 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있다.
Signature의 구조는 Header + Payload와 서버가 갖고 있는 유일한 key 값을 합친 것을 Header에서 정의한 알고리즘으로 암호화를 한다.
Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다. 따라서 Signature는 토큰의 위변조 여부를 확인하는데 사용된다.
JWT도 토큰 탈취의 위험성이 있기 때문에 Access Token, Refresh Token 으로 이중으로 나누어 인증을 하는 방식을 많이 사용한다.
Access Token : 클라이언트가 갖고있는 실제로 유저의 정보가 담긴 짧은 수명의 토큰. 클라이언트에서 요청이 오면 서버에서 해당 토큰에 있는 정보를 활용하여 사용자 정보에 맞게 응답을 진행
Refresh Token : 새로운 Access Token을 재발급해주기 위해 사용하는 토큰.