JWT (JSON Web Token) - 토큰 갱신과 관리

FeelsBotMan·2025년 3월 7일
0

JWT

목록 보기
2/5

토큰 갱신

JWT 갱신은 주로 액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token)을 사용하여 이루어진다. 이 방식의 주요 특징과 과정은 다음과 같다:

토큰 구조

  • 액세스 토큰: 짧은 유효 기간(예: 1시간)을 가지며, 사용자 인증에 사용
  • 리프레시 토큰: 긴 유효 기간(예: 일주일에서 한 달)을 가지며, 새로운 액세스 토큰을 발급받는 데 사용

갱신 과정
1. 사용자 로그인 시, 서버는 액세스 토큰과 리프레시 토큰을 모두 발급한다.
2. 액세스 토큰이 만료되면, 클라이언트는 리프레시 토큰을 사용하여 새로운 액세스 토큰을 요청한다.
3. 서버는 리프레시 토큰의 유효성을 검증한 후, 새로운 액세스 토큰을 발급한다.

리프레시 토큰이 굳이 필요한가?

액세스 토큰만 사용하면

  1. 만료된 후 자동 갱신 불가

    • 액세스 토큰이 만료되면 사용자는 다시 로그인해야 함.
    • UX가 나빠지고, 세션이 자주 끊어질 수 있음.
  2. 긴 만료 시간은 보안 취약점

    • 만약 액세스 토큰을 길게 설정하면, 토큰이 탈취되었을 때 위험성이 증가함.
    • 짧게 설정하면 사용자가 자주 로그인해야 하는 불편함이 있음.
  3. 토큰을 탈취당하면 재사용 가능

    • 액세스 토큰만 사용하면 탈취된 토큰을 즉시 차단할 방법이 부족함. 서버는 그 토큰을 무효화할 방법이 없으므로 만료 시간이 지날 때까지 유효한 상태로 남아있음.
    • 액세스 토큰을 차단하려면 블랙리스트를 사용해야 하는데, JWT는 기본적으로 서버에서 상태를 저장하지 않는 방식이므로, 블랙리스트를 유지하면 Stateless한 장점이 사라짐.

리프레시 토큰이 필요한 이유

  1. 짧은 만료 시간의 액세스 토큰 사용 가능

    • 액세스 토큰을 5~15분 정도의 짧은 시간으로 설정하고, 만료 시 리프레시 토큰을 이용해 자동으로 갱신.
    • 보안이 강화되고, 사용자 경험도 개선됨.
  2. 리프레시 토큰이 도난당해도 차단 가능

    • 리프레시 토큰을 서버에서 블랙리스트 관리할 수 있음.
    • 탈취된 토큰을 무효화할 수 있기 때문에 보안성이 증가함.

토큰 탈취를 인지하는 방법

리프레시 토큰이 탈취당했을 때 이를 인지하고 차단하는 방법을 고민해야 한다.
일반적으로 리프레시 토큰은 액세스 토큰보다 훨씬 긴 만료 시간을 가지므로, 보안이 중요하다.


1. 리프레시 토큰 탈취를 인지하는 방법

1) 기존과 다른 IP, 기기에서 요청 감지

  • 사용자의 최근 로그인 정보(IP, User-Agent, 기기 정보 등)를 기록하고, 리프레시 요청이 기존 정보와 다르면 의심해야 함.
  • 예를 들어:
    • 사용자가 한국에서 로그인했는데, 갑자기 다른 나라에서 리프레시 요청이 발생한다면 이상 징후로 간주 가능.

대응 방법

  • 리프레시 요청이 기존과 다른 환경에서 발생하면 추가 인증(예: 이메일 인증, OTP 요청).
  • 비정상적인 경우 리프레시 토큰을 폐기하고 사용자에게 알림 전송.

2) 동일한 리프레시 토큰이 여러 곳에서 사용됨

  • 하나의 리프레시 토큰은 한 번만 사용되도록 설계하고, 한 번 사용된 토큰이 또 요청되면 탈취 가능성이 높음.
  • 즉, 리프레시 토큰이 재사용되면 탈취된 것으로 판단 가능.

대응 방법

  • 리프레시 토큰을 한 번 사용하면 즉시 폐기하고, 새 리프레시 토큰 발급(Rotating Refresh Token 방식).
  • 이전 리프레시 토큰이 다시 사용되면 로그아웃 처리 및 사용자에게 알림 전송.

3) 너무 짧은 시간에 다수의 리프레시 요청 발생

  • 정상적인 사용자는 보통 액세스 토큰이 만료될 때만 리프레시 요청을 보냄(예: 15~30분에 한 번).
  • 하지만, 탈취된 리프레시 토큰을 사용해 공격자가 여러 번 요청을 보내는 경우 이상 징후로 감지 가능.

대응 방법

  • 일정 시간 내 리프레시 요청 횟수를 제한(rate limiting).
  • 예를 들어, 30분 내에 2번 이상 리프레시 요청이 들어오면 계정 보호 모드 발동.

2. 리프레시 토큰 탈취 대응 방법

1) 리프레시 토큰을 DB에서 관리

  • 리프레시 토큰을 데이터베이스에 저장하고, 탈취 시 폐기할 수 있도록 관리해야 함.
  • Redis 같은 인메모리 저장소를 활용해 빠르게 블랙리스트 처리 가능.

대응 방법

  • 리프레시 토큰을 발급할 때마다 DB에 저장하고, 로그아웃하거나 탈취 의심 시 즉시 삭제.
  • 블랙리스트 시스템 운영 → 탈취된 토큰을 무효화하고 다시 사용되지 않도록 방지.

2) 리프레시 토큰 Rotation 적용 (강력 추천)

  • 기존 리프레시 토큰을 사용하면 즉시 폐기하고 새 토큰을 발급.
  • 즉, 한 번 사용한 리프레시 토큰은 다시 사용할 수 없도록 제한.
  • 만약 이전 토큰이 다시 요청되면 탈취 가능성이 크므로, 해당 계정을 보호 모드로 전환.

대응 방법

  • JWT 내부에 jti(unique ID) 포함하고, 서버에서 관리.
  • 새 토큰이 발급되면 기존 토큰은 폐기하여 재사용 불가능하도록 함.

3. 리프레시 토큰을 DB에 저장하는 이유

  1. 리프레시 토큰은 만료기간이 길다.
    JWT 액세스 토큰과 달리, 길면 30일 정도인데

  2. 사용자가 로그아웃할 때 무효화할 수 있음
    DB에 저장하면 특정 사용자의 리프레시 토큰을 삭제해서 강제로 로그아웃시키는 게 가능하다

  3. 리프레시 토큰의 재사용 감지 가능
    보통 "1회용"으로 사용하고, 새로운 리프레시 토큰을 발급할 때 기존 토큰을 폐기하는 식으로 관리하면, 토큰 탈취를 감지할 수 있다.

4. 결론: 리프레시 토큰 보안 강화를 위해 해야 할 것

IP, 기기 정보 비교 → 다른 환경에서 요청하면 추가 인증 요구
리프레시 토큰 재사용 방지 → 한 번 사용된 토큰이 다시 사용되면 계정 보호
요청 횟수 제한 → 짧은 시간 동안 너무 많은 요청이 들어오면 차단
리프레시 토큰을 서버에서 관리 → 탈취된 토큰을 무효화 가능
Rotation 적용 → 매번 새로운 리프레시 토큰을 발급하여 보안 강화

위 방식을 조합하면 리프레시 토큰이 탈취되더라도 빠르게 감지하고 대응할 수 있다.

profile
안드로이드 페페

0개의 댓글