JWT는 토큰 자체에 유저 정보를 담아 암호화한 토큰이다. 암호화된 내용은 디코딩 과정을 통해 해석한다.
토큰은 아래와 유사한 형태를 띠고 있습니다.
JsloAsiO.Ask2Fks2.RF3fsmdF3
물론 실제로는 훨씬 길겠지요! 참고를 위한 예시일 뿐입니다. ˚✧₊⁎( ˘ω˘ )⁎⁺˳✧༚
예시를 보면 콤마로 구분되어 세 마디로 이루어져 있는 것을 발견해셨을 겁니다. 세 부분은 각각 Header
, Payload
, Signature
라고 합니다. 즉 토큰은 다음과 같은 구조로 이루어져 있는 것이죠~
{Header}.{Payload}.{Signature}
- Header: 어떤 타입의 데이터를 다룰지? 어떤 암호화, 해싱 알고리즘을 사용할지 등에 대한 정보
- Payload: JSON 형식의 실제 보관한 데이터가 포함
- Signature: 토큰에서 가장 중요한 역할을 하는 부분으로, 유저가 데이터를 볼 수만 있고 수정은 할 수 없게 하는 역할을 하는 부분. 즉, 조작 여부를 확인하고 서버에서만 데이터를 수정할 수 있게 함!
-> Header
와 Payload
는 꼭 암호화가 된 것처럼 보이지만, 데이터를 주고받기 편리하게 base64 포맷으로 변환만 된 상태입니다.
-> Signature
는 Header와 Payload를 조합하고 비밀키를 이용하여 만들어낸 해시값이 포함되어 있습니다. 즉, 암호화되어 있어요.
브라우저는 서버에서 토큰을 받으면 유저가 보낸 Header와 Payload를 이용해서 Signature를 만들게 되는데, 만약 값이 다르면 무언가 조작된 데이터가 전달된 것임을 알게 됩니다.
즉, 사용자는 암호화되지 않은 Header와 Payload는 디코딩하여 확인할 수 있으나, 수정은 하지 못하게 되는 것입니다.