목차 열기
서비스 인증 및 인가
역할: Spring Boot ↔ FastAPI AI 서버 간 통합 인증/인가 · JWT · Redis · Istio 연동
1. 개요
Spring Boot 메인 서버와 FastAPI AI 추론 서버 간의 통합 인증 및 인가 프로토콜을 정의합니다. 사용자의 보안 세션을 유지하고, AI 모델(vLLM) 및 VQA 스트리밍 자원에 대한 비정상 접근을 차단하는 것을 목적으로 합니다.
1.1 프로젝트 개요
| 항목 | 내용 |
|---|---|
| 목적 | 시스템 자원 보호 및 사용자 식별을 위한 인증/인가 메커니즘 정의 |
| 대상 | Next.js 프론트엔드, Spring Boot 메인 서버, FastAPI AI 추론 서버 |
| 사용 기술 | Java 21, Spring Security, JWT, Redis, Python 3.12 (FastAPI) |
1.2 목표
- 인증 목표: 사용자 식별 및 통합 세션 관리
- 인가 목표: 역할 기반 권한 제어(RBAC) 및 AI 자원 보호
2. 인증 메커니즘
2.1 기술 스택
| 항목 | 내용 |
|---|---|
| Method | 카카오 OAuth 2.0 기반 자체 JWT 발급 |
| Algorithm | HS256 (Spring Boot ↔ FastAPI Secret Key 공유), RS256 (Istio Gateway 검증 연동) |
| Storage | Redis (refresh_token:{jti}) Refresh Token 저장 및 블랙리스트 관리 |
| Access TTL | 15분 |
| Refresh TTL | 7일 |
검증: iss와 aud 클레임을 필수로 검증하며, 개발 환경은 HS256, 운영 환경은 RS256으로 전환을 운영합니다.
2.2 토큰 구조 (Payload)
{
"iss": "goormgb-auth-service",
"sub": "user_uuid_12345",
"aud": "goormgb-api",
"jti": "unique-id-v4",
"auth": "ROLE_USER",
"tokenType": "ACCESS",
"iat": 1737510000,
"exp": 1737513600
}
3. 프로토콜 상세 및 데이터 흐름
3.1 로그인 및 토큰 발급
- Client (Next.js)가 카카오 OAuth 로그인 요청
- Main Server (Spring Boot)가 인증 성공 시 JWT 쌍(Access/Refresh) 생성
- Refresh Token은 Redis에 저장 (RTR 방식 적용)
- Client에 토큰 전달
토큰 재발급 시 RTR(Refresh Token Rotation) 방식을 채택하여, 사용된 기존 Refresh Token은 즉시 폐기하고 새로운 쌍을 발급합니다.
3.2 블랙리스트 관리 (로그아웃)
로그아웃 시 Access Token의 jti를 Redis 블랙리스트에 등록하여 만료 전까지의 모든 재사용 시도를 차단합니다.
| 구분 | 내용 | 비고 |
|---|---|---|
| Back-end | Java 21 / Spring Boot 3.4.2 | Spring Security, JWT 활용 |
| AI Engine | Python 3.12 / FastAPI | vLLM 기반 실시간 VQA 응답 |
| Database | PostgreSQL (RDB) / Redis (Cache) | 세션 캐싱 및 Threat Score 관리 |
| Token Type | Access Token (15m) / Refresh Token (7d) | Redis를 통한 토큰 Rotation 적용 |
4. API 명세
4.1 인증 헤더 규격
모든 보호된 자원에 대한 요청은 아래 헤더를 포함해야 합니다.
Authorization: Bearer {Access_Token}
4.2 주요 엔드포인트
| 기능 | 경로 | Method | 설명 |
|---|---|---|---|
| 로그인 | /auth/kakao/callback | POST | Access/Refresh 토큰 발급 |
| 토큰 갱신 | /auth/token/refresh | POST | 토큰 재발급 - 쿠키 사용 |
| 사용자 정보 | /users/me | GET | JWT 검증 필수 |
4.3 인프라 보안 및 전송 계층 (Istio 연동)
- 상호 TLS(mTLS) 강제: 클러스터 내부의 모든 서비스 간 통신(Main ↔ AI ↔ Redis)은 Istio의 PeerAuthentication을 통해 상호 인증 및 암호화
- Gateway JWT 필터링: 인그레스 게이트웨이 레벨에서 JWT의 유효성을 1차 검증하여, 비정상 요청이 백엔드까지 도달하지 않도록 방어
- 인가 정책(AuthorizationPolicy) 제어: L7 레벨에서 서비스 간 호출 권한을 관리하여 허가되지 않은 내부 경로 접근(Lateral Movement) 차단
5. 보안 가드레일 및 예외 처리
5.1 실시간 위협 대응
- Redis 연동: Redis에 저장된 유저별 Threat Score를 매 요청마다 확인
- 위협 점수 임계치 초과 시 해당 유저의 jti 세션 정보를 삭제하여 즉시 강제 로그아웃
- Anomaly 탐지: PyOD 모델이 마우스 궤적 및 클릭 간격에서 이상 징후 포착 시 해당 유저의 토큰을 즉시 블랙리스트 처리
5.2 AI 보안
모든 AI 요청 페이로드는 FastAPI의 Prompt Guard 레이어를 통과해야 합니다. 프롬프트 인젝션 의심 시 403 Forbidden 반환.
5.3 에러 코드
| 코드 | 의미 |
|---|---|
| 401 Unauthorized | 토큰 만료 또는 서명 불일치 (Next.js에서 /login 리다이렉트) |
| 403 Forbidden | 권한 부족 또는 보안 위협 점수 초과 |
| 429 Too Many Requests | Rate Limit 초과 |
| 보안 계층 | 적용 기술 | 목적 |
|---|---|---|
| AI 방어 | Prompt Guard | 프롬프트 인젝션 및 PII 마스킹 |
| 행동 분석 | PyOD / Scikit-learn | 마우스 궤적 및 클릭 기반 비정상 패턴 탐지 |
| 성능 최적화 | KEDA (Kubernetes) | 대기열 기반 GPU 오토스케일링 |
| 추적/평가 | LangSmith / RAGAS | LLM 호출 추적 및 방어 성공률 벤치마킹 |
6. 운영 지침 및 주의사항
6.1 운영 지침
- 배포 및 관제: Vercel(Front)과 Docker(Back) 기반 MSA 구조로 배포하며, LangSmith를 통해 지속적으로 품질을 모니터링
- Threat Score 임계값 초과 시 즉시 Redis 세션 만료 및 403 반환
- 토큰 탈취 의심 시 전역 로그아웃(Logout All Devices) 기능 수행
6.2 주의사항
- Spring Boot (3.4.2):
OncePerRequestFilter를 상속받아 JWT 검증 로직 구현.SecurityConfig에서 비동기 요청(SSE)에 대한 보안 컨텍스트 유지 설정 필요 - FastAPI:
HTTPBearer를 사용하여 의존성 주입(Depends) 형태로 토큰 검증기 구현 - Next.js (15): Zustand에 저장된 Access Token 만료 시 axios interceptor에서
/refreshAPI 호출 로직 구현 - CORS:
AllowCredentials: true설정 필수. Refresh Token을 쿠키로 주고받기 위해 필요하며, 프론트엔드 도메인에 대해 메인 서버와 AI 서버 모두 명확한 Allow 정책 필요
부록 — 참고자료 및 용어
참고자료
- RFC 7519 (JSON Web Token): JWT 구조 및 보안 클레임 정의 표준
- OAuth 2.0 Authorization Framework: 위임 인가 프레임워크 업계 표준
- FastAPI / vLLM Documentation: 비동기 추론 서버 구현 및 GPU 오토스케일링 연동 가이드
- Spring Security 6.x Specification: Java 21 환경에서의 필터 체인 및 인증 객체 관리
용어 정의
| 용어 | 설명 |
|---|---|
| Access Token | 보호된 자원 접근용 단기 토큰 (유효기간: 15분) |
| Refresh Token | Access Token 갱신용 장기 토큰. Redis 관리 및 RTR 적용 (유효기간: 7일) |
| VQA | 이미지 분석 기반 질답 AI 기술. FastAPI + vLLM 처리 |
| Prompt Guard | LLM 요청 시 악의적 프롬프트 필터링 보안 레이어 |
| Threat Score | 유저 행동 패턴(마우스 궤적, 클릭 등) 분석 실시간 위협 점수. Redis 캐싱으로 세션 차단 여부 결정 |
| KEDA | Kubernetes 이벤트 기반 오토스케일러. 대기열 길이 기반 GPU 서버 조절 |
| SSE | 서버에서 클라이언트로 실시간 데이터 스트리밍 단방향 통신. AI 추론 결과 실시간 응답에 사용 |