Playball Logo

Command Palette

Search for a command to run...

목차 열기

서비스 인증 및 인가

역할: 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 발급
AlgorithmHS256 (Spring Boot ↔ FastAPI Secret Key 공유), RS256 (Istio Gateway 검증 연동)
StorageRedis (refresh_token:{jti}) Refresh Token 저장 및 블랙리스트 관리
Access TTL15분
Refresh TTL7일

검증: issaud 클레임을 필수로 검증하며, 개발 환경은 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 로그인 및 토큰 발급

  1. Client (Next.js)가 카카오 OAuth 로그인 요청
  2. Main Server (Spring Boot)가 인증 성공 시 JWT 쌍(Access/Refresh) 생성
  3. Refresh Token은 Redis에 저장 (RTR 방식 적용)
  4. Client에 토큰 전달

토큰 재발급 시 RTR(Refresh Token Rotation) 방식을 채택하여, 사용된 기존 Refresh Token은 즉시 폐기하고 새로운 쌍을 발급합니다.

3.2 블랙리스트 관리 (로그아웃)

로그아웃 시 Access Token의 jti를 Redis 블랙리스트에 등록하여 만료 전까지의 모든 재사용 시도를 차단합니다.

구분내용비고
Back-endJava 21 / Spring Boot 3.4.2Spring Security, JWT 활용
AI EnginePython 3.12 / FastAPIvLLM 기반 실시간 VQA 응답
DatabasePostgreSQL (RDB) / Redis (Cache)세션 캐싱 및 Threat Score 관리
Token TypeAccess Token (15m) / Refresh Token (7d)Redis를 통한 토큰 Rotation 적용

4. API 명세

4.1 인증 헤더 규격

모든 보호된 자원에 대한 요청은 아래 헤더를 포함해야 합니다.

Authorization: Bearer {Access_Token}

4.2 주요 엔드포인트

기능경로Method설명
로그인/auth/kakao/callbackPOSTAccess/Refresh 토큰 발급
토큰 갱신/auth/token/refreshPOST토큰 재발급 - 쿠키 사용
사용자 정보/users/meGETJWT 검증 필수

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 RequestsRate Limit 초과
보안 계층적용 기술목적
AI 방어Prompt Guard프롬프트 인젝션 및 PII 마스킹
행동 분석PyOD / Scikit-learn마우스 궤적 및 클릭 기반 비정상 패턴 탐지
성능 최적화KEDA (Kubernetes)대기열 기반 GPU 오토스케일링
추적/평가LangSmith / RAGASLLM 호출 추적 및 방어 성공률 벤치마킹

6. 운영 지침 및 주의사항

6.1 운영 지침

  • 배포 및 관제: Vercel(Front)과 Docker(Back) 기반 MSA 구조로 배포하며, LangSmith를 통해 지속적으로 품질을 모니터링
  • Threat Score 임계값 초과 시 즉시 Redis 세션 만료 및 403 반환
  • 토큰 탈취 의심 시 전역 로그아웃(Logout All Devices) 기능 수행

6.2 주의사항

  1. Spring Boot (3.4.2): OncePerRequestFilter를 상속받아 JWT 검증 로직 구현. SecurityConfig에서 비동기 요청(SSE)에 대한 보안 컨텍스트 유지 설정 필요
  2. FastAPI: HTTPBearer를 사용하여 의존성 주입(Depends) 형태로 토큰 검증기 구현
  3. Next.js (15): Zustand에 저장된 Access Token 만료 시 axios interceptor에서 /refresh API 호출 로직 구현
  4. 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 TokenAccess Token 갱신용 장기 토큰. Redis 관리 및 RTR 적용 (유효기간: 7일)
VQA이미지 분석 기반 질답 AI 기술. FastAPI + vLLM 처리
Prompt GuardLLM 요청 시 악의적 프롬프트 필터링 보안 레이어
Threat Score유저 행동 패턴(마우스 궤적, 클릭 등) 분석 실시간 위협 점수. Redis 캐싱으로 세션 차단 여부 결정
KEDAKubernetes 이벤트 기반 오토스케일러. 대기열 길이 기반 GPU 서버 조절
SSE서버에서 클라이언트로 실시간 데이터 스트리밍 단방향 통신. AI 추론 결과 실시간 응답에 사용