결론부터 말하면, 우리가 생각하는 토큰에 signature 부분만 암호화 되는거임. Header랑 payload부분은 base64 인코딩임
JWT(JSON Web Token)는 기본적으로 3개의 파트로 구성되어 있습니다: 헤더(header), 페이로드(payload), 그리고 서명(signature). SHA-256은 JWT의 서명을 생성하는 데 사용되며, 이는 단방향 해시 알고리즘으로 암호화된 값입니다. 아래에서 서버가 토큰 만료 여부를 확인하는 원리를 단계별로 설명하겠습니다.
JWT의 구성
- 헤더(Header): 토큰의 타입과 해싱 알고리즘 정보를 포함합니다.
{ "alg": "HS256", "typ": "JWT" }
- 페이로드(Payload): 토큰에 포함된 클레임(정보)입니다. 여기에는 토큰 만료 시간(exp), 발급 시간(iat), 사용자 정보 등이 들어갑니다.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622
}
- 서명(Signature): 헤더와 페이로드를 조합해 서버의 비밀 키를 이용해 생성된 값입니다. HS256 알고리즘의 경우 다음과 같이 생성됩니다
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
서버가 JWT를 검증하고 만료를 확인하는 과정
- 토큰 디코딩 및 분리
- 클라이언트로부터 받은 JWT는 .으로 구분된 세 파트로 이루어져 있습니다: header.payload.signature.
- 서버는 헤더와 페이로드 부분을 Base64 디코딩하여 읽습니다.
- 디코딩된 페이로드에서 만료 시간(exp)을 확인할 수 있습니다.
- 서명 검증
- 서버는 토큰의 헤더와 페이로드를 재조합하여 서명을 생성합니다. 이때 서버는 클라이언트와 공유되지 않은 비밀 키(secret)를 사용합니다.
- 생성된 서명과 클라이언트가 제공한 서명을 비교하여 변조 여부를 확인합니다.
- 만료 시간 확인
- 현재시간과 비교하여 토큰이 만료되었는지 확인합니다.
