JWT(Json Web Token) : https://www.jwt.io/
- JWT의 기본 개념
- JWT의 구조(헤더, 페이로드, 시그니처)
- JWT가 생성되고 검증되는 과정
- JWT를 안전하게 관리하는 방법, 보안 고려사항
- 실무에서 JWT를 어덯게 활용하는가
JWT(JSON Web Token)
JWT는 데이터를 안전하고 간결하게 전송하기 위해 고안된 인터넷 표준 인증 방식
특히, 토큰 기반 인증(Token-Based Authentication)에서 가장 범용적으로 사용된다
- JSON 포맷으로 사용자 정보를 담음
- 담긴 정보를 Base64URL로 인코딩함
- Secret Key와 알고리즘을 이용해서 서명(Signature)을 추가하여 위변조를 방지하고 끝
1. JWT와 일상속 토큰
JWT는 출입 카드와 비슷한 개념으로, 특정 권한을 가진 사용자가 시스템을 이용할 수 있게 해줌
"나는 정당한 권리를 가진 사용자니까 이 권한으로 무엇무엇을 할게"
JWT의 구조
JWT는 세 부분으로 나뉘며, 각각은 점으로 구분된다.

- Header : 어떤 알고리즘으로 서명했는지, 어떤 타입의 토큰인지 정의함
- Payload : 사용자 정보와 클레임(Claim) 데이터가 담김
- Signature : 헤더와 페이로드가 변조되지 않았음을 검증
1. Header
{
"alg": "HS256", # 사용할 서명 알고리즘(예: HMAC SHA256)
"typ": "JWT" # 토큰 타입(JWT)
}
이러한 형태의 JSON 객체를 Base64URL로 인코딩하면 JWT의 첫번째 부분이 된다
2. Payload
{
"sub": "user123",
"name": "B1uffer",
"iat": 1516239022
}
- 사용자의 고유 정보와 권한, 토큰 발급 시간(jat) 등이 포함됨
- 민감한 정보를 직접 담아서는 안된다
- Base64URL로 인코딩하면 두번째 부분이 된다.
3. Signature
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
- 서버의 비밀 키(Secret Key)로 생성된다
- 클라이언트가 보낸 토큰이 변조되지 않았음을 검증한다
JWT의 동작 흐름
Access Token과 Refresh Token
JWT는 보통 두가지 종류의 토큰과 함께 사용된다
| 구분 | Access Token | Refresh Token |
| 목적 | API 요청시 인증/인가 | Access Token 재발급 |
| 유효기간 | 짧음(분~시간 단위) | 김(일~주 단위) |
| 보관 위치 | 보통 메모리/스토리지 | 안전하게 보관 필요 |
Access Token만 있으면 권한 요청은 가능하지만, 탈취될 경우 큰 피해가 발생할 수 있으므로 반드시 짧은 만료기간을 설정해야함
JWT 사용 예시
앱 A가 Gmail과 연동되어 이메일을 읽어와야 하는 경우,
- 사용자가 Gmail 인증서버에 로그인함(ID, PW 제출)
- 인증에 성공하면 서버는 JWT를 발급해줌
- 앱 A는 이 JWT를 Authorization 헤더에 넣어서 Gmail API를 요청함
- Gmail 서버는 JWT의 서명을 검증 후 이메일 데이터를 반환해줌
이러한 과정을 통해 사용자는 Gmail 비밀번호를 앱 A에 직접 제공하지 않아도 안전하게 데이터를 연동할 수 있음
팁
JWT는 편리하지만, 잘못 사용하면 보안에 취약해질 수 있다.
1. 민감한 정보 포함 금지
- JWT는 Base64URL로 인코딩되어 있을 뿐, 암호화되진 않는다
- 따라서 토큰 안에 비밀번호, 주민등록번호 같은 민감한 정보를 절대 넣지 말아야함
2. 토큰 만료기간 설정
- 토큰은 만료기간(exp)를 반드시 설정해야한다
- 만료기간이 없는 토큰은 탈취될 경우, 영구적으로 악용될 수 있다
3. HTTPS 사용
- JWT는 네트워크를 통해 전달되므로 반드시 HTTPS를 통해 암호화된 채널에서만 전송해야한다
4. 저장 위치 주의
- 로컬 스토리지(Local Storage) 대신 HTTPOnly 쿠키 또는 보안이 강화된 세션 스토리지 사용을 권장한다고 함.
- 로컬 스토리지는 XSS 공격에 취약하다고 한다.
5. 토큰 무효화 전략
- 기본적으로 JWT는 발급 후 만료 전까지 무효화할 수 없다.
- 이를 보완하기 위해 서버 측에서 블랙리스트를 관리하거나 Redis같은 인메모리 DB를 활용할 수 있다.
팁
- Access Token은 짧은 만료 시간을 설정해 보안성을 높인다
- 중요한 API 요청에는 추가적인 인증(IP제한, MFA 등등..)을 적용한다.
- 로그아웃시에는 토큰을 무효화할 수 있도록 서버 측 블랙리스트를 활용하는게 좋다.
- JWT는 서버 확장성이 중요한 마이크로서비스 아키텍처에서 특히 유용하다고 함.
정리
| 항목 | 설명 |
| JWT | JSON 데이터를 인코딩 + 서명하여 인증에 사용하는 토큰 |
| 구조 | Header, Payload, Signature 세 부분으로 구성 |
| 장점 | 서버 확장성에 유리함, 세션 불일치 문제가 없음 |
| 단점 | 토큰 무효화가 어려움, 탈취시 보안이 위험함 |
| 사용 예시 | OAuth, API 인증, 마이크로서비스간 통신 등 |
'Spring Boot > 유저 관리 기능' 카테고리의 다른 글
| 인가와 권한 관리 : 인가 (0) | 2026.03.15 |
|---|---|
| Authorization 헤더, 토큰 기반 인증 : Refresh 토큰 (0) | 2026.03.15 |
| Authorization 헤더, 토큰 기반 인증 : Authorization 헤더 (1) | 2026.03.13 |
| 기본 인증, 인코딩 : 기본 인증 보안 고려사항 (1) | 2026.03.10 |
| 기본 인증, 인코딩 : 인코딩과 Base64URL (0) | 2026.03.10 |