Skip to content

[보안] Admin API 인증 보강 — JWT 분리, refresh 재검증, IP 제한 #646

@ImNM

Description

@ImNM

배경

PR #643 의 Admin 인증 구조 검토 결과, JWT에 role을 넣는 방식의 근본적 문제 발견.
역할 변경이 토큰 만료 전까지 반영되지 않음. 인증 방식 자체를 단순화.

핵심 변경

현재: JWT(userId + role) → role 믿고 통과
변경: JWT(userId만) → DB/Redis에서 실시간 role 체크

왜?

  • 역할 강등해도 기존 토큰으로 계속 접근 가능 (현재 문제)
  • Admin refresh 재검증, JWT 클레임 분리 같은 복잡한 해결책 불필요
  • 매 요청마다 실시간 권한 확인 → 가장 안전하고 단순

구현 계획

1. JWT에서 role 제거

  • JWT payload: userId만 포함 (role 제거)
  • JwtTokenProvider 수정: role claim 발급/파싱 제거

2. 요청마다 DB/Redis에서 role 조회

  • Security Filter에서 userId로 유저 조회 → role 확인
  • Redis 캐시 적용 (매번 DB 안 치게)
    요청 → JWT에서 userId 추출 → Redis 캐시 조회 (miss시 DB)
    → role 확인 → SecurityContext에 authorities 설정
    

3. 역할 변경 시 캐시 무효화

  • User.changeRole() 호출 시 Redis 캐시 invalidate
  • 다음 요청부터 새 role 즉시 적용

4. Admin 토큰 분리 (헤더/쿠키 이름)

  • 일반 유저: Authorization: Bearer {token}
  • 어드민: X-Admin-Token: {token} (또는 별도 쿠키)
  • 어드민 API는 어드민 토큰만 허용 (일반 JWT로 접근 불가)

수락 기준

  • JWT payload에 role 없음 (userId만)
  • 역할 강등 → 즉시 API 접근 차단 (토큰 만료 기다릴 필요 없음)
  • 일반 유저 JWT로 /internal-api/** 접근 시 403
  • Redis 캐시 동작 확인 (캐시 miss → DB 조회 → 캐시 저장)
  • E2E 테스트 통과

관련

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions