2025. 10. 4. 17:02ㆍ프로그래밍/web
JWT를 공부하다보니 이해가 안되는 부분이 여러개 있어서 공부하면서 이해했고 정리해보려고 한다.
JWT란 무엇인가?
- 인증과 정보 전달을 효율적으로 하기위한 토큰.
- Header. Payload. Signature 형식으로 이뤄져있음. 각 부분은 Base64URL 타입으로 인코딩됨.
- Header : 토큰 타입과 서명에 사용된 알고리즘 정보를 담고있음.
-
{ "alg": "HS256", "typ": "JWT" }
-
- Payload : 토큰에 담길 클레임을 기록함. 발급자, 대상, 만료 시간, 사용자 정의 데이터 등
-
{ "sub": "1234567890", "name": "andy", "role": "admin", "iat": 1717151721, "exp": 1717155321 }
-
- Signature : Base64UrlEncode(header) + "." + Base64UrlEncode(payload)를 비밀키 혹은 비대칭키로 서명한 값. 토큰 위변조를 판별할때 사용됨
-
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key )
-
- Header : 토큰 타입과 서명에 사용된 알고리즘 정보를 담고있음.
흐름

내가 이해가 잘 안됐던 부분
1. 이걸로 어떻게 보안 문제를 해결할 것인가? 그냥 다른 사용자가 jwt 탈취해서 header에 붙여서 요청보내면 원래 사용자처럼 행세할수 있는거 아닌가?
-> JWT는 위조를 막아주는 것이고 복사 탈취를 막아주지 못한다. 기존 방식대로 사용자 정보를 header에 담아서 보낸다고 가정해보자. 예를 들어 header에 name : "andy" , role : "developer"으로 적혀있다고 가정해보자.
그럼 누군가가 그걸 name : "andy", role : "admin"으로 변경해도 파악할수 있는 방법이 없다. 하지만 jwt를 사용하면 Signature 인증모듈에서 걸리게 될것.
다만 탈취후 다른 요청 header에 붙여서 요청 보내면 원래 사용자처럼 행세할수있는데 이걸 해결하기 위해
1. 모든 토큰교환은 HTTPS를 통해서 평문 전송 금지 제한
2. 토큰 만료시간은 짧게해서 탈취 할수있는 시간을 짧게, 탈취하더라도 사용할수없게
3. 리프레시 토큰은 서버 세션에 저장
2. 강제 로그아웃, 블랙리스트 처리를 어떻게 할수있을까?
-> 사용하다보면 사용자를 블랙리스트 처리해야하는 상황이 생길수 있는데 이 부분은 여러가지 방법이 있을수있을거같다
1. 해당 사용자 JWT에 식별자 포함하고 토큰에 식별자가 있으면 못들어오도록 설정
2. 사용자 DB 테이블에 token 버전 필드를 놓고, 로그 아웃시킬때, DB 테이블에 token 버전 필드를 변경. 인증할때 토큰값과 DB값을 검사함
3. 민감정보를 보내야하는 상황이 있을텐데 어떻게 하면될까?
1. 토큰 자체를 암호화한다.
2. 토큰 자체는 암호화하지 않되, 민감 정보를 담은 payload만 암호화한다.
4. 분산 환경에서 키를 어떻게 검증하면 좋을까?
1. kms같은 키 저장 보관소를 사용한다.
2. 공개키를 배포해서 분산 검증
'프로그래밍 > web' 카테고리의 다른 글
| HTTP 자주 나오는 응답코드 정리 (0) | 2022.01.13 |
|---|---|
| [Spring boot] 분산 트랜젝션 (0) | 2021.12.07 |
| [Spring]Cookie와 활용법(읽기, 생성 및 저장) (0) | 2021.09.20 |
| [JAVA] abstract class vs interface (0) | 2021.08.02 |
| [Spring] Spring MVC framework를 사용한 웹은 어떻게 작동할까? (0) | 2021.07.19 |