클라이언트에서 JWT를 포함해 요청을 보내면 서버는 허가된 JWT인지를 검사한다. 또한 로그아웃을 할 경우 로컬 스토리지에 저장된 JWT 데이터를 제거한다. (실제 서비스의 경우에는 로그아웃 시, 사용했던 토큰을 blacklist라는 DB 테이블에 넣어 해당 토큰의 접근을 막는 작업을 해주어야 한다.)
JWT 토큰 웹에서 보통 Authorization HTTP 헤더를 Bearer <토큰>으로 설정하여 클라이언트에서 서버로 전송되며, 서버에서는 토큰에 포함되어 있는 서명(signature) 정보를 통해서 위변조 여부를 빠르게 검증할 수 있게 된다
JWT 의 경우 유저가 전송하는 데이터를 숨기는 것 보다는, 유저가 전송하는 데이터를 인증하는 데 집중한다.
curl http://127.0.0.1:3000/ -H 'Authorization: Bearer <jwt>
JWT
는 Header, Payload, Signature 3가지로 구성되어있으며, 각 요소는 .
으로 구분된다. 각각의 구성요소에 대해서 한번 알아보자.
토큰의 header 는 typ & alg 두 가지 정보로 구성된다
{
"alg": 서명 및 토큰 검증에 사용할 알고리즘 방식 지정 ex) HS256 or RSA
"typ": token type ex) JWT
}
token 에서 사용할 정보들의 조각인 claim 이 담겨있다.
서명(Signature)은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
서명(Signature)은 위에서 만든 헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64Url로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64Url로 인코딩하여 생성한다.
토큰이 발급된 후 누군가가 Payload의 정보를 수정하면 Payload에는 다른 누군가가 조작된 정보가 들어가 있지만 Signatute에는 수정되기 전의 Payload 내용을 기반으로 이미 암호화 되어있는 결과가 저장되어 있기 때문에 조작되어있는 Payload와는 다른 결과값이 나오게 된다.
이러한 방식으로 비교하면 서버는 토큰이 조작되었는지 아닌지를 쉽게 알 수 있고, 다른 누군가는 조작된 토큰을 악용하기가 어려워진다
signature 부분의 경우 header 와 payload 를 header 에 명시된 algorithm 과 개인키를 통해서 서명한다.
signature = HMAC-SHA256( base64urlEncode(header) + "." + base64urlEncode(payload), secret_salt )
[refresh token 에 관하여 잘 정리된 글] https://velog.io/@park2348190/JWT%EC%97%90%EC%84%9C-Refresh-Token%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80
https://mangkyu.tistory.com/56
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC