JWT 토큰을 사용할 때 Access Token만 사용하는 경우 많은 문제가 발생합니다. 이를 해결하기 위해 Refresh Token을 사용하는데요, Refresh Token은 보안과 관련된 핵심 개념 중 하나로, 특히 인증이 필요한 웹 애플리케이션에서 자주 사용됩니다.
목차
위의 목차를 클릭하면 해당 글로 자동 이동 합니다.
1. JWT 토큰이란?
JWT(JSON Web Token)는 클라이언트와 서버 간 인증 및 정보 교환을 위한 토큰 기반 인증 방식입니다. JWT는 간단하고 효율적이며, 다양한 애플리케이션에서 널리 사용됩니다.
동작 방식
서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의합니다.
Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급합니다.
2. Access Token만 사용하는 경우 문제점
Access Token은 일반적으로 짧은 수명을 가집니다 (예: 15분 ~ 1시간). 이는 보안을 강화하기 위해 설정됩니다.
짧은 수명으로 인한 빈번한 인증
- Access Token만 사용하는 경우, 토큰이 만료되면 클라이언트는 다시 인증을 받아야 합니다.
- 결과적으로 사용자가 자주 로그인을 해야 하며, 이는 사용자 경험(UX)에 부정적인 영향을 미칩니다.
토큰 탈취 시 보안 위험
- Access Token만 사용하는 경우, 빈번한 인증을 줄이기 위해 만료 기간을 길게 설정할 것입니다. Access Token은 서버 리소스에 바로 접근할 수 있는 권한을 부여하기 때문에 탈취될 경우 공격자는 해당 토큰을 사용해 오랜 기간 리소스에 접근할 수 있습니다.
- Access Token만 사용하는 경우 탈취된 토큰이 만료되기 전까지 막을 수 있는 방법이 없습니다.
로그아웃 처리의 어려움
- Access Token만 사용할 경우 서버에서 로그아웃 처리가 어렵습니다.
- JWT는 기본적으로 상태를 저장하지 않는 "Stateless" 구조를 따릅니다. 즉, 서버는 클라이언트가 보낸 Access Token만 검증할 수 있으며, 특정 사용자의 세션을 무효화하려면 다음과 같은 추가 작업이 필요합니다:
- Blacklist: 서버에 만료된 또는 취소된 토큰을 추적하는 메커니즘을 추가.
- Whitelist: 활성화된 토큰만 추적 및 허용.
- 둘 다 서버 자원을 소모하며 JWT의 Stateless 장점을 무너뜨릴 수 있습니다.
인증 서버 부하 증가
- Access Token의 짧은 수명으로 인해 사용자는 더 자주 로그인을 요청하게 됩니다.
- 이는 인증 서버에 부하를 줄 수 있으며, 특히 사용자가 많을수록 서버 리소스를 효율적으로 사용하지 못하게 됩니다.
3. Refresh Token이란?
Refresh Token은 Access Token의 만료 시 새로운 Access Token의 발급을 요청하기 위해 사용되는 토큰입니다. 일반적으로 Access Token은 짧은 유효기간을 가지며, 만료되었을 때 사용자는 다시 로그인해야 합니다. Refresh Token은 사용자가 다시 로그인하지 않더라도 새로운 액세스 토큰을 발급받을 수 있도록 돕는 역할을 합니다.
Access Token vs Refresh Token
항목 | Access Token | Refresh Token |
유효기간 | 짧음 (예: 15분 ~ 1시간) | 비교적 김 (예: 며칠 ~ 몇 주) |
역할 | API 인증 요청 | 새로운 Access Token 발급 |
Refresh Token이 필요한 이유
짧은 수명으로 인한 빈번한 인증 해소
- Refresh Token은 비교적 긴 유효 기간(예: 며칠 ~ 몇 주)을 가지며, 사용자가 다시 로그인하지 않고 새로운 Access Token을 발급받을 수 있도록 합니다.
- 이렇게 하면 짧은 Access Token 유효 기간을 유지하면서도 사용자 경험을 해치지 않을 수 있습니다.
보안 강화
- 토큰이 네트워크를 통해 전송되는 과정에서 탈취되면 공격자가 해당 토큰을 악용할 수 있습니다. 하지만 Refresh Token은 일반적으로 클라이언트가 API 요청 시마다 전송하지 않아 탈취 가능성이 적습니다.
- Access Token이 탈취되더라도, 짧은 유효 기간으로 인해 공격자는 제한된 시간 동안만 이를 악용할 수 있습니다.
- 탈취된 Access Token으로 API 요청을 할 때, 서버는 Refresh Token이 없으므로 장기적으로는 더 이상 토큰 갱신이 불가능해 보안적으로 유리합니다.
서버 부하 감소
- JWT는 Stateless 방식으로 설계되어 서버가 토큰 상태를 저장하지 않습니다. 따라서 토큰이 만료된 경우, 서버는 클라이언트에게 새로운 인증을 요구해야 합니다.
- Refresh Token을 사용하면 서버는 토큰을 상태로 저장하지 않으면서도 필요한 경우 새로운 Access Token을 발급할 수 있습니다.
강제 로그아웃 및 토큰 관리
- Refresh Token이 있으면, 서버에서 관리하고 Refresh Token을 폐기함으로써 Access Token 재발급을 방지할 수 있습니다. 이를 통해 토큰 관리와 보안을 보다 세밀하게 조정할 수 있습니다.
4. Refresh Token 탈취 위험
Refresh Token의 통신 빈도가 적기는 하지만 탈취 위험에서 완전히 벗어난 것은 아닙니다.
탈취 경로
- 네트워크 공격: 토큰이 HTTPS가 아닌 연결에서 전송될 때 도청 가능.
- 클라이언트 측 취약점: 로컬 스토리지, 세션 스토리지, 또는 쿠키에서 탈취.
- 서버 측 데이터 유출: 서버의 Refresh Token 저장소가 공격받을 경우 유출.
- 악성 스크립트: XSS(Cross Site Scripting) 공격을 통해 클라이언트의 토큰을 탈취.
탈취 시 발생하는 문제점
- 무단 Access Token 생성: 공격자는 탈취한 Refresh Token을 사용해 무제한으로 새로운 Access Token을 생성할 수 있습니다. Access Token을 이용해 사용자의 데이터에 접근하거나 보호된 API를 호출할 수 있습니다.
- 세션 하이재킹: 공격자가 Refresh Token으로 Access Token을 지속적으로 갱신하면서 사용자 세션을 장악할 수 있습니다.
- 서버 리소스 남용: 공격자가 Refresh Token을 대량으로 악용해 Access Token 발급 요청을 남발할 경우, 서버 리소스가 불필요하게 소모됩니다. 이는 서비스 거부(DoS) 공격으로 이어질 수 있습니다.
탈취 방지 대책
- HttpOnly 쿠키 사용: 토큰을 클라이언트 측에서 접근할 수 없도록 HttpOnly 쿠키에 저장하면, XSS 공격으로부터 토큰을 보호하는 데 효과적입니다.
- 1회성 토큰(One-Time Token) 방식: Refresh Token이 사용되면 즉시 폐기하고 새로 발급합니다.
- TLS(HTTPS) 강제화: Refresh Token을 안전하게 전송하기 위해 HTTPS를 사용하도록 강제합니다.
- 토큰 스코프 제한: Refresh Token으로 할 수 있는 작업을 최소화하여, 탈취 시 피해를 줄입니다.
- 적절한 유효기간 설정: Refresh Token에도 적절한 만료 기간을 설정해 탈취 후 악용 시간을 줄입니다.
아래 링크는 OAuth에서 제시한 Refresh Token Rotation 방식입니다. 클라이언트가 Access Token를 재요청할 때마다 Refresh Token도 새로 발급받습니다. 궁금하시면 참고해보세요!
Refresh Token은 강력한 인증 체계를 지원하지만, 탈취되면 큰 위협이 될 수 있습니다. 이를 방지하기 위해 안전한 저장 방식과 네트워크 보안을 적용하고, 탈취 가능성을 최소화하는 설계가 필요합니다.
추천글
'개발 공부 일지 > ETC' 카테고리의 다른 글
주소창에 www.google.com을 검색하면 일어나는 일 (4) | 2024.12.23 |
---|---|
[SVGR] Next.js에서 SVGR 사용하기 (6) | 2024.12.13 |
프레임워크(Framework)와 라이브러리(Library)의 차이 (3) | 2024.12.03 |
UNIX (0) | 2024.09.09 |