나의 길

JWT에 대한 이해 본문

Framework/Spring boot

JWT에 대한 이해

MoonjuLee 2024. 12. 3. 21:56
JWT(JSON Web Token)!

 

 JWT가 사용되는 경우는 권한 부여와 정보 교환을 할 때입니다. 가장 일반적으로는 권한 부여.

 

 권한 부여는 사용자가 로그인을 하면 그 이후의 각 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용된 경로, 서비스 및 리소스에 액세스 할 수 있습니다.

 

 JWT는 Header, Payload, signature로 구성됩니다. 그리고 각 부분은 .(점)으로 구분됩니다.

 

일반적인 JWT의 구조

 

Header

 

 Header는 아래와 같이 구성됩니다.

 

Header

 

 토큰의 유형(typ), 서명 알고리즘(alg)입니다. 서명 알고리즘은 보통 (HMAC SHA256 또는 RSA 등) 입니다.

 위의 JSON은 Base64Url로 인코딩 되어 JWT의 Header를 구성합니다.

 

Payload

 

 Payload는 Claim을 포함합니다. Claim은 토큰에서 사용할 정보의 조각들입니다.

 

Payload

 

 등록된 Claim은 sub(제목), exp(만료시간), iss(발급자), aud(청중) 및 기타가 있습니다. 클레임 이름은 세 글자로만 구성합니다.

 

 공개 Claim은 JWT를 사용하는 사람들이 자유롭게 정의할 수 있지만 충돌 방지를 위해 URI로 정의해야 합니다.

 

공개 Claim

 

 비공개 Claim은 당사자 간에 정보를 공유하기 위한 Claim이다. 위의 name, admin 같은 Claim이다.

 

 Payload는 Base64Url로 인코딩 되어 JWT의 두 번째 부분을 형성합니다.

 

Signature

 

  Signature는 Header와 Payload, Signature를 기반으로 생성되고, 토큰이 변조되지 않았음을 확인합니다.

 

 인코딩 된 Header, 인코딩된 Payload, 인코딩된 값을 비밀 키를 이용해 Header에서 정의한 알고리즘으로 hashing, Hashing 한 값을 다시 인코딩하여 Signature를 생성합니다.

 

Signature

 

작동법

 

 사용자가 성공적으로 로그인하면 JWT를 반환합니다. 사용자가 보호된 경로나 리소스에 엑서스 하려고 할 때마다 일반적으로 Bearer 스키마를 사용하여 Authorization 헤더에 JWT를 보냅니다. 아래는 헤더 내용의 예시입니다.

 

 HTTP Header를 통해 위에 이미지처럼 JWT를 보냅니다(<token>). JWT는 일부 서버 헤더에서는 8KB 이상을 허용하지 않기 때문에 주의를 요합니다!

 또한 토큰에 포함된 모든 정보가 사용자나 다른 당사자에게 노출된다는 점을 유의해야 합니다. 그러니 비밀 정보를 넣으면 안 됩니다.

 

이해를 돕기 위한 이미지

 

정리

 

 JWT를 사용하는 이유는 JSON은 대부분 언어에서 흔히 볼 수 있고, 객체에 직접 매핑되기도 하기 때문입니다, 하지만 토큰이 탈취되거나 하는 보안적으로 해결해야 하는 부분이 있을 수 있기 때문에 해당 부분들을 잘 고려하고 사용해야 합니다.

 

참고 자료

 

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

Comments