JWT

JWT 는 JSON Web Token 의 약자로 인증에 필요한 정보들을 암호화시킨 토큰을 말하며, Access Token 으로 사용된다. JWT 를 생성하기 위해서는 Header, Payload, Verify Signature 객체가 필요하다.

Header

토큰의 타입을 나타내는 typ 과 암호화할 방식을 정하는 alg 로 구성되어 있다.

{
  'alg': 'HS256',
  'typ': 'JWT'
}

Payload

토큰에 담을 정보를 포함한다. 여기서 하나의 정보 조각을 클레임 이라고 부른다. 클레임의 종류로는 Registered, Public, Private 으로 3가지가 존재한다. 보통 만료 일시, 발급 일시, 발급자, 권한정보 등을 포함한다.

{
  'sub': '1234567890',
  'name': 'John Doe',
  'admin': true,
  'iat': 1516239022
}

Verify Signature

Payload 가 위조/변조되지 않았다는 사실을 증명하는 문자열이다. Base64 방식으로 인코딩한 Header, Payload 그리고 SECRET KEY 를 더한 후 서명된다.

HMACSHA256 {
  base64UrlEncode(header) + '.' +
  base64UrlEncode(payload),
  your-256-bit-secret
}

완성된 토큰

Untitled

Header, Payload 는 인코딩될 뿐 따로 암호화하지 않는다. 따라서 Header 와 Payload 는 누구나 디코딩이 가능하여 정보가 쉽게 노출될 수 있다. 하지만 Verify Signature 는 SECRET KEY 를 알지 못하면 복호화할 수 없다.

만약 해커가 사용자의 토큰을 훔쳐 Payload 의 데이터를 변경하여 토큰을 서버로 보낸다면 서버에서 Verify Signature 을 검사하게 된다. 여기서 Verify Signature 는 해커의 정보가 아닌 사용자의 정보를 기반으로 암호화되었기 때문에 해커가 변경한 정보로 보낸 토큰은 유효하지 않은 토큰으로 간주한다. 이를 통해 사용자의 SECRET KEY 를 모르면 토큰을 조작할 수 없다는 것을 알 수 있다.

인증 순서

Untitled

장점