-
Notifications
You must be signed in to change notification settings - Fork 6
Closed
Labels
Description
배경
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 테스트 통과
관련
- feat: 내부 운영 어드민 API + 인증 + context-path 제거 #643 (Admin API PR)
- [리팩토링] Admin 코드를 DuDoong-Admin 모듈로 분리 + 인증 보강 #645 (Admin 모듈 분리)
Reactions are currently unavailable