Spring/Spring

[Spring] JWT 서명 검증의 원리

JoonYong 2024. 7. 24. 23:15

서론

유튜브를 보다가 우연히 JWT에 대해 설명해 주는 영상을 접하게 되었습니다. 영상을 보며 JWT의 서명 검증 원리를 너무 쉽게 설명해 주어서, 이를 바탕으로 본 게시글을 작성하게 되었습니다. 이번 포스팅에서는 JWT의 기본적인 구조와 서명 생성 및 검증 과정을 쉽게 설명해 보려고 합니다.

JWT 구조 

JWT(JSON Web Token)는 세 가지 주요 구성 요소로 이루어져 있습니다: 헤더(header), 페이로드(payload), 서명(signature). 이 이미지는 JWT의 각 부분을 시각적으로 설명합니다.

 

  • 헤더(Header): 알고리즘 유형과 토큰 유형을 지정합니다. 예시에서는 HS256 알고리즘과 JWT 타입이 사용되었습니다.
  • 페이로드(Payload): 토큰의 데이터가 포함된 부분입니다. 여기에는 사용자 정보와 같은 클레임(claim)이 포함됩니다. 예시에서는 사용자 ID, 이름, 이메일, 관리자 여부가 포함되어 있습니다. 여기서 중요한 점은 클레임은 서버가 무조건 믿어서는 안 되고, 일종의 '주장'으로 받아들여야 한다는 것입니다.
  • 서명(Signature): 페이로드와 헤더를 기반으로 비밀 키를 사용해 생성됩니다. 이는 토큰의 무결성과 출처를 검증하는 데 사용됩니다.

 

1단계: Signature 생성

 


JWT(JSON Web Token)를 사용하려면 세 가지 중요한 요소가 필요합니다. 비밀 키(secret key), 내용(payload), 서명을 만드는 알고리즘입니다. 여기서는 HMAC 알고리즘을 사용하여 이 과정을 설명합니다.

페이로드와 비밀 키를 HMAC에 입력하여 고유한 서명을 만듭니다.

  • secret keypayload : 시크릿 키와 페이로드가 필요합니다. 페이로드에는 안전하게 전송할 데이터가 포함됩니다.
  • HMAC 알고리즘: HMAC(해시 기반 메시지 인증 코드) 알고리즘을 사용하여 서명을 생성합니다. 



2단계: 데이터 전송

서명이 생성되면 페이로드와 서명을 상대방에게 전송할 수 있습니다. 중요한 점은 비밀 키는 절대 전송되지 않으며 서버에 안전하게 보관됩니다.

 

 

3단계: 서명 검증

먼훗날에 클라이언트가 서버에 요청을 보내면 서버는 다음을 수행합니다:

  1. 요청 헤더에서 JWT 토큰을 가져옵니다.
  2. 클라이언트가 준 JWT 토큰의 payload와 서버에서 갖고있던 scret key를 HMAC알고리즘에 입력한다
  3. 생성된 signature을 클라이언트가 제공한 signature과 비교합니다.
  4. 일치한다면 이 payload는 서버에서 만든게 맞습니다.

 

결국 header와 payload를 바탕으로 이런 signature를 만들 수 있는 사람은 해당 secret key를 갖고 있는 사람밖에 없기 때문에 이 JWT 본 서버가 로그인한 사용자에게 발급한 것이라는 것을 확신할 수 있습니다.

 

 

 

 

 

 

 

 

[Reference]

https://www.youtube.com/watch?v=36lpDzQzVXs&t=44s