나의 길
JWT에 대한 이해 본문
JWT(JSON Web Token)!
JWT가 사용되는 경우는 권한 부여와 정보 교환을 할 때입니다. 가장 일반적으로는 권한 부여.
권한 부여는 사용자가 로그인을 하면 그 이후의 각 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용된 경로, 서비스 및 리소스에 액세스 할 수 있습니다.
JWT는 Header, Payload, signature로 구성됩니다. 그리고 각 부분은 .(점)으로 구분됩니다.
Header
Header는 아래와 같이 구성됩니다.
토큰의 유형(typ), 서명 알고리즘(alg)입니다. 서명 알고리즘은 보통 (HMAC SHA256 또는 RSA 등) 입니다.
위의 JSON은 Base64Url로 인코딩 되어 JWT의 Header를 구성합니다.
Payload
Payload는 Claim을 포함합니다. Claim은 토큰에서 사용할 정보의 조각들입니다.
등록된 Claim은 sub(제목), exp(만료시간), iss(발급자), aud(청중) 및 기타가 있습니다. 클레임 이름은 세 글자로만 구성합니다.
공개 Claim은 JWT를 사용하는 사람들이 자유롭게 정의할 수 있지만 충돌 방지를 위해 URI로 정의해야 합니다.
비공개 Claim은 당사자 간에 정보를 공유하기 위한 Claim이다. 위의 name, admin 같은 Claim이다.
Payload는 Base64Url로 인코딩 되어 JWT의 두 번째 부분을 형성합니다.
Signature
Signature는 Header와 Payload, Signature를 기반으로 생성되고, 토큰이 변조되지 않았음을 확인합니다.
인코딩 된 Header, 인코딩된 Payload, 인코딩된 값을 비밀 키를 이용해 Header에서 정의한 알고리즘으로 hashing, Hashing 한 값을 다시 인코딩하여 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
'Framework > Spring boot' 카테고리의 다른 글
DTO를 사용하며 정리한 내용 (0) | 2024.12.04 |
---|---|
당연하게 생성하던 spring boot 프로젝트 구조 살펴보기 (0) | 2024.04.28 |
쿠키와 세션 및 spring security 알아보기 (0) | 2024.03.31 |
유데미(Udemy) 옆집 개발자와 같이 진짜 이해하며 만들어보는 첫 Spring Boot 프로젝트 수강 후기! (0) | 2023.12.24 |
Spring boot + H2 사용하기 (0) | 2023.11.07 |