JWT 의 필요성과 등장 배경
JWT는 클라이언트-서버 간의 인증 정보를 안전하고 간편하게 전달하기 위해 고안되었습니다. 특히, 서버가 상태를 관리하지 않는(stateless) 환경에서 확장성과 성능 면에서 큰 이점을 제공합니다.
JWT(Json Web Token) 은 통신 정보를 JSON 형식을 사용하여 안전하게 전송하기 위해 사용됩니다. JWT는 토큰 자체에 정보가 포함되어 있는 클레임 기반 토큰입니다. 일반적인 애플리케이션에서 JWT는 주로 인증과 인가를 구현하기 위해 사용됩니다.
JWT의 구조
JWT는 헤더, 페이로드, 시그니처로 구분됩니다. 헤더에는 토큰의 암호화 알고리즘이나 타입을 가지며, 페이로드에는 데이터(만료일, 사용자 정보 등)을 가집니다. 시그니처는 헤더와 페이로드가 변조되지 않았는지 판단하기 위해 사용되는데요. 헤더와 페이로드를 비밀 키를 사용하여 헤더에 명시된 암호화 알고리즘으로 암호화하여 시그니처가 만들어집니다.
JWT의 장점
- Stateless (무상태성)
- 서버에서 인증 정보를 따로 저장할 필요가 없어 확장성이 뛰어남.
- 즉, 여러 개의 서버(로드 밸런싱 환경)에서도 인증 상태를 일관되게 유지할 수 있음.
- 빠른 인증 처리
- 토큰이 클라이언트에 저장되어 있으므로 서버에서 별도의 인증 상태를 조회할 필요 없이 요청마다 토큰을 검증하여 처리 가능.
- 보안 강화
- 토큰은 서명(Signed)되어 있어 변조 여부를 쉽게 감지할 수 있음.
- 비대칭 키(예: RSA)를 사용하면 서명 검증과 발급을 다른 주체가 수행할 수도 있음.
- 다양한 플랫폼 지원
- JSON 기반이기 때문에 웹, 모바일, 데스크톱 환경에서 모두 쉽게 활용 가능.
JWT 사용 시 주의할 점
- 토큰 탈취 위험
- JWT는 기본적으로 클라이언트가 보관하는 방식이므로, 토큰이 탈취될 경우 이를 악용할 수 있음.
- 해결 방안:
- HTTPS를 사용하여 네트워크 전송 시 암호화.
- 토큰을 로컬 스토리지보다는 HTTP-Only 쿠키에 저장하여 XSS 공격을 방지.
- Access Token이 탈취되더라도 짧은 만료 시간을 설정하고, Refresh Token을 이용해 재발급.
- 토큰의 크기 문제
- JWT는 서명을 포함하기 때문에 크기가 커질 수 있음.
- 해결 방안:
- 불필요한 정보를 페이로드에 포함하지 않음.
- Base64 URL Encoding으로 인해 용량이 커질 수 있으므로 필요한 정보만 최소한으로 유지.
- 서버에서 토큰을 쉽게 무효화할 수 없음
- 일반적인 JWT는 서버에서 발급 후 클라이언트가 보관하는 방식이므로, 만약 유효한 JWT가 탈취되면 별도로 취소할 방법이 없음.
- 해결 방안:
- 로그아웃 시 토큰을 서버에서 차단할 방법(예: 블랙리스트 테이블, Redis 캐시 등)을 고려해야 함.
- Refresh Token을 사용하여 주기적으로 새로운 Access Token을 발급하는 구조를 채택.
JWT와 Refresh Token의 조합
Access Token은 짧은 만료 시간을 설정하고, Refresh Token을 이용하여 새 Access Token을 발급하는 방식이 일반적입니다.
- Access Token
- 사용자가 API를 요청할 때 사용.
- 짧은 만료 시간(예: 5~15분) 설정하여 탈취 위험을 최소화.
- Refresh Token
- Access Token이 만료되었을 때, 새로운 Access Token을 발급받기 위한 토큰.
- 서버에서 저장 가능하며, 더 긴 만료 시간(예: 7일~30일)을 가짐.
- Refresh Token 사용 시, 로그인 유지 기능을 안전하게 구현 가능.
JWT를 활용한 인증 방식 예시
- 사용자가 로그인 요청을 보냄.
- 서버가 사용자의 자격 증명을 검증한 후 Access Token과 Refresh Token을 발급.
- 클라이언트는 API 요청 시 Access Token을 포함하여 요청을 보냄.
- Access Token이 만료되면, Refresh Token을 이용해 새로운 Access Token을 요청.
- 서버는 Refresh Token을 검증한 후, 새로운 Access Token을 발급.
'SPRING' 카테고리의 다른 글
[Spring] Custom AutoConfiguration 만들어보기 (1) | 2025.04.10 |
---|---|
[Spring] MSA(MicroService Architecture) 구현 (1) | 2025.04.09 |
[Spring] Spring Boot Container란 무엇인가? (0) | 2024.12.26 |
[Spring] Maven vs Gradle (0) | 2024.12.24 |
[Spring] Spring Boot AutoConfiguration(자동 설정) (2) | 2024.12.23 |