배경
대화 캡처 이미지 기반 장소·맥락 제안 기능을 추가할 예정입니다.
이미지는 Spring을 거치지 않고 Front에서 FastAPI로 직접 전송하며, FastAPI가 이미지 분석과 카카오 장소 검색을 담당합니다. 사용자가 결과를 확정한 이후에는 기존 Spring의 POST /api/core/v1/records로 저장합니다.
Front → FastAPI → 이미지 분석 및 카카오 장소 검색
Front → Spring → 최종 장소 기록 저장
필요한 이유
FastAPI의 이미지 분석 API는 로그인한 사용자만 호출할 수 있어야 합니다.
Access Token은 HttpOnly 쿠키이므로 브라우저가 FastAPI 요청에 자동으로 첨부할 수 있지만, FastAPI가 JWT만 직접 검증하면 토큰 발급 후 탈퇴한 회원을 즉시 확인할 수 없습니다.
FastAPI가 탈퇴 여부를 확인하기 위해 Spring을 호출해야 하므로, Spring에서 다음 내용을 한 번에 확인하는 내부 API를 제안합니다.
- JWT 서명 및 만료 여부
- Access Token 용도
- 회원 ID
- 탈퇴하지 않은 활성 회원인지
이미지나 대화 내용은 Spring에 전달하지 않고 Access Token만 전달합니다.
제안 흐름
1. Front가 이미지와 Access Token 쿠키를 FastAPI에 전달
2. FastAPI가 Access Token만 Spring 내부 API에 전달
3. Spring이 JWT를 검증
4. Spring이 MemberRepository.isActive()로 활성 회원 여부 확인
5. Spring이 active와 memberId를 FastAPI에 반환
6. active=true인 경우에만 FastAPI가 이미지 분석 진행
제안 API
POST /api/core/v1/internal/auth/introspect
Cookie: access_token={JWT}
X-Internal-Secret: {AI_TO_CORE_SECRET}
/v1/auth/**는 공개 경로이므로, 내부 API는 /v1/internal/** 아래에 둡니다.
유효한 활성 회원
{
"success": true,
"data": {
"active": true,
"memberId": 123
}
}
토큰이 잘못됐거나 만료됐거나 탈퇴한 회원
{
"success": true,
"data": {
"active": false
}
}
memberId는 active=true인 경우에만 반환합니다.
구현 조건
- 기존
JwtTokenProvider.parseAccessToken()을 재사용합니다.
- JWT 검증 후
MemberRepository.isActive(memberId)를 반드시 확인합니다.
- 기존 Spring 공통 응답 envelope을 유지합니다.
- Spring→FastAPI 시크릿과 분리된
AI_TO_CORE_SECRET을 사용합니다.
- 해당 내부 API는
X-Internal-Secret 검증을 통과한 요청만 처리합니다.
- 서비스 간 POST 요청이므로 해당 경로를 Spring CSRF 검사에서 제외합니다.
- CSRF 예외 처리 이유를 인증 문서와 테스트에 명시합니다.
- 내부 API는 외부 Ingress에서 접근할 수 없도록 차단합니다.
- Access Token과 내부 시크릿은 요청·오류 로그에 기록하지 않습니다.
- Spring에 이미지나 대화 내용은 전달하지 않습니다.
완료 조건
- 유효한 활성 회원의 토큰은
active=true와 memberId를 반환합니다.
- 위조·만료·용도가 다른 토큰은
active=false를 반환합니다.
- 탈퇴 회원의 유효한 JWT도
active=false를 반환합니다.
- 내부 시크릿이 없거나 일치하지 않으면 요청을 거부합니다.
- CSRF 토큰 없이도 내부 시크릿이 유효한 서비스 간 요청은 처리됩니다.
- 외부에서 내부 인증 API에 직접 접근할 수 없습니다.
- 정상·만료·위조·탈퇴·시크릿 누락에 대한 테스트가 포함됩니다.
관련 협의
공용 계약 문서에 다음 내용을 먼저 반영할 예정입니다.
- 신규 이미지 분석 흐름
- FastAPI→Spring 토큰 검증 요청
- 역방향 내부 시크릿
- 내부 API의 CSRF 예외
- 외부 FastAPI 경로와 Infra 라우팅
배경
대화 캡처 이미지 기반 장소·맥락 제안 기능을 추가할 예정입니다.
이미지는 Spring을 거치지 않고 Front에서 FastAPI로 직접 전송하며, FastAPI가 이미지 분석과 카카오 장소 검색을 담당합니다. 사용자가 결과를 확정한 이후에는 기존 Spring의
POST /api/core/v1/records로 저장합니다.필요한 이유
FastAPI의 이미지 분석 API는 로그인한 사용자만 호출할 수 있어야 합니다.
Access Token은
HttpOnly쿠키이므로 브라우저가 FastAPI 요청에 자동으로 첨부할 수 있지만, FastAPI가 JWT만 직접 검증하면 토큰 발급 후 탈퇴한 회원을 즉시 확인할 수 없습니다.FastAPI가 탈퇴 여부를 확인하기 위해 Spring을 호출해야 하므로, Spring에서 다음 내용을 한 번에 확인하는 내부 API를 제안합니다.
이미지나 대화 내용은 Spring에 전달하지 않고 Access Token만 전달합니다.
제안 흐름
제안 API
/v1/auth/**는 공개 경로이므로, 내부 API는/v1/internal/**아래에 둡니다.유효한 활성 회원
{ "success": true, "data": { "active": true, "memberId": 123 } }토큰이 잘못됐거나 만료됐거나 탈퇴한 회원
{ "success": true, "data": { "active": false } }memberId는active=true인 경우에만 반환합니다.구현 조건
JwtTokenProvider.parseAccessToken()을 재사용합니다.MemberRepository.isActive(memberId)를 반드시 확인합니다.AI_TO_CORE_SECRET을 사용합니다.X-Internal-Secret검증을 통과한 요청만 처리합니다.완료 조건
active=true와memberId를 반환합니다.active=false를 반환합니다.active=false를 반환합니다.관련 협의
공용 계약 문서에 다음 내용을 먼저 반영할 예정입니다.