JWT(JSON Web Token)가 토큰의 유효성을 검증하는 방법

2025. 2. 7. 19:36CS/보안

최근 NestJS에서 JWT를 사용해서 인증을 구현하는 일감을 받았는데 그전에 어설프게 알고 있던 제 자신을 반성하면서 JWT에 대해 다시 학습하고 정리하는 글을 작성해보려고 합니다. 다만, 해당 포스팅에서는 JWT에 대한 기본적인 개념에 대해서 전부 정리하는 것보다는 인증 서버(JWT를 발행한 서버)에서 토큰의 유효성을 어떻게 검증하지에 초점을 맞췄습니다. 


JWT(JSON Web Token) 가 토큰의 유효성을 검증하는 방법

reference by https://jwt.io

JWT는 Header, Payload, Signature 3가지 구성요소로 이루어져 있으며 각 부분을.(dot)으로 구분하고 있습니다. 

주의할 부분은 Payload는 Base64 URL 인코딩 방식으로 변환된 값입니다. 즉, 암호화되지 않은 인코딩 값이기 때문에 쉽게 디코딩해서 내용물을 볼 수 있음으로 노출에 민감한 개인정보를 이메일이나 비밀번호를 그대로 담는 것은 위험할 수 있습니다. (인코딩은 데이터를 숨기는 기능이 아닙니다.) 

 

JWT를 사용해서 인증을 구현한겠다는 건 요청에 대상이 되는 서버에 접근을 JWT로 하여금 식별하겠다는 걸 의미합니다. 즉, 해당 토큰이 인증서버가 발행한 유효한 토큰인지 식별하고 유효하다면 대상 서버에 접근을 허용하는 단순한 구조입니다. 쉽게 말하면 고전적인 아이디 패스워드 방식과는 다르게 아이디, 비밀번호를 검증하고 일치했을 때 서버로 접근을 하는 것이 아닌 토큰 자체가 유효한지 여부만 체크하는 것입니다. 

 

토큰이 유효한지에 대한 여부는 Signature가 결정합니다.

Signature = HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey )

Signature는 JWT의 Header와 Payload를 인증 서버가 미리 정의한 Private Key로 특정 암호화 알고리즘을 사용해 생성한 값입니다.

예를 들어서, Private Key 값이 'qwer',  암호화 알고리즘은 HS256을 사용해서 Signature를 만들면 아래와 같습니다. 

8RjVMJiGzil4yNHLb0ewXDrdU32laRoOId_VBY391bQ

 

그렇다면 서버는 해당 토큰이 유효한지 어떻게 판단할까요? 사실, 서버는 Payload의 내용에는 관심이 없습니다. 대신, 주어진 Header와 Payload를 미리 정해진 Private Key와 암호화 알고리즘을 사용해 Signature를 생성하고, 이를 요청된 JWT의 Signature와 비교합니다. 즉, Payload가 변조되더라도 공격자가 Private Key를 모른다면 인증 서버가 생성한 Signature와 일치하지 않으므로, 대상 서버는 해당 토큰이 유효하지 않다고 판단하고 접근을 허용하지 않습니다.

 

즉, 공격자는 private Key를 모르기 때문에 유효한 Signature를 만들수 없고 대상 서버는 유효하지 않은 요청에 대해서 접근을 차단할 수 있게 되는 겁니다. 

 

 

 

'CS > 보안' 카테고리의 다른 글

XSS (Cross-Site-Scripting)  (2) 2022.03.24
공개키와 비공개키  (0) 2022.02.24
HTTPS와 HTTP의 차이와 SSL 디지털 인증서  (0) 2022.02.22