JWT란?
인증의 종류
1. 세션 인증
기본적으로 브라우저에서 사용자가 인증(Authentication)을 수행하면 서버에서는 사용자의 정보를 저장하고, 그 응답으로 JSESSIONID 라는 키를 이용해 클라이언트(사용자) 브라우저의 쿠키에 세션의 정보를 저장하게 됩니다.
이후 클라이언트는 브라우저 쿠키에 저장된 JSESSIONID 로 저장된 세션 정보를 이용해 인가(Authrization)된 정보에 접근할 수 있게 됩니다.
2. 토큰 인증
토큰인증 방식은 사용자가 인증을 수행하면 서버에서는 토큰을 생성한 뒤에 저장하지 않고(stateless) 토큰값을 사용자의 브라우저에게 응답합니다.
이 토큰 값을 사용자가 인가된 사용자만 사용할 수 있는 서비스를 요청할 때 함께 보내게 되고, 서버에서 이 토큰을 의미 있는 값(보통은 사용자 정보)으로 해석하게 됩니다. 그리고 이 값으로 사용자를 인증하게 됩니다.
토큰은 username, user_id 등 사용자를 설명할 수 있는 데이터를 포함하게 됩니다. 참고로 이렇게 사용자를 설명할 수 있는 데이터를 클레임(claim) 이라고 합니다.
JWT(Json Web Token)
JWT는 토큰 방식의 인증을한다.
JWT 토큰 구조는 온점( . )으로 순서대로 header, payload, verify_signature 로 이루어져 있다.
하나씩 살펴보자.
# HEADER . PAYLOAD . VERIFY_SIGNATURE
# jwt 예시)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
HEADER
HEADER 는 JWT를 검증하는데 필요한 정보를 가진 데이터입니다.
VERIFY_SIGNATURE 에 사용한 암호화 알고리즘과 토큰 타입, key 의 id 등의 정보를 가지고 있습니다.
난해한 문자열처럼 보이지만 암호화된 값은 아닙니다.
PAYLOAD
실질적으로 인증에 필요한 데이터를 저장합니다. 데이터 각각의 필드를 클레임(claim) 이라고 하고,
대부분의 경우 클레임에 username 또는 user_id 를 포함합니다.
인증시에 payload에 있는 username을 가져와서 사용자의 정보를 인증할 때 사용해야 하기 때문입니다.
또한 payload에서 중요하게 살펴보아야 할 정보는 토큰 발행시간(iat)와 토큰 만료시간(exp) 입니다.
토큰의 만료 시간이 지나면 새로운 토큰을 발급받아야 합니다.
VERIFY SIGNATURE
header 와 payload는 암호화되지 않았기 때문에 두 개의 데이터만으로 토큰의 진위 여부 판단할 수 없습니다.
따라서 토큰의 진위 여부를 판단하기 위한 암호화된 데이터가 필요합니다.
JWT의 구조에서 가장 마지막에 있는 VERIFY SIGNATURE 는 토큰 자체의 진위여부를 판단하는 용도로 사용합니다.
VERIFY SIGNATURE 는 Base64UrlEncoding 된 header 와 payload 의 정보를 합친 뒤 SECRET_KEY 를 이용하여 Hash 를 생성하여 암호화 합니다.