인터널 프론트를 위한 CORS 설정 추가 - #73
Conversation
- 인터널 관리 화면(BCSD_INTERNAL_RECODE_V2, T-26)이 별도 오리진에서 credentials: 'include'로 브라우저에서 직접 API를 호출한다. 지금까지 SecurityConfig에 .cors(...)가 전혀 없어서 실제 브라우저 요청은 전부 CORS로 막힌다(테스트는 MockMvc라 CORS 필터를 거치지 않아 이 문제가 드러나지 않았다). - app.cors.allowed-origins(CORS_ALLOWED_ORIGINS 환경변수, 기본 http://localhost:3000)로 허용 오리진을 설정한다. credentials를 쓰므로 Allow-Origin에 "*"를 쓸 수 없어 명시적 오리진 목록 + allowCredentials(true)로 구성했다. - refresh token 쿠키는 SameSite=Lax인데, internal.bcsdlab.com과 api.internal.bcsdlab.com은 같은 eTLD+1(bcsdlab.com)이라 SameSite 기준으로는 same-site이므로 운영 환경에서는 이미 문제가 없다. 로컬 개발에서 리프레시가 계속 실패한다면 REFRESH_TOKEN_COOKIE_SECURE=false(기본값 true라 http://localhost에서 Secure 쿠키가 버려진다)를 켜야 한다는 점은 프론트 셸 PR에 남긴다. 검증: ./gradlew test 전체 통과, 3회 연속. 허용 오리진 실제 요청·preflight·비허용 오리진 각각 CORS 헤더로 확인.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Refs #7 (BCSD_INTERNAL_RECODE_V2) |
|
🔴 이 PR은 불필요할 가능성이 높습니다 — 제 실수로 만든 문제였습니다. 인터널 프론트( const API_ORIGIN = process.env.API_ORIGIN ?? 'http://localhost:8080';
async rewrites() {
return [{ source: '/v1/:path*', destination: `${API_ORIGIN}/v1/:path*` }];
}브라우저는 same-origin으로 제가 CORS 문제를 겪은 건 이 프록시를 확인하지 않고 프론트에서 닫는 걸 권합니다. 브라우저 외 클라이언트가 API를 직접 호출할 계획이 있으면 그때 다시 올리는 게 맞다고 봅니다. 판단은 맡기겠습니다 — 스택 아래쪽(#68~#72)에 붙어 있으니 닫으실 거면 #74의 base를 #72로 바꿔야 합니다. |
배경
인터널 관리 화면(T-26,
BCSD_INTERNAL_RECODE_V2)이 별도 오리진에서credentials: 'include'로 브라우저에서 직접 API를 호출한다. 지금까지SecurityConfig에.cors(...)가 전혀 없어서, 테스트(MockMvc는 CORS 필터를 거치지 않음)는 통과했지만 실제 브라우저 요청은 전부 CORS로 막히는 상태였다. 프론트 셸을 붙이기 전에 먼저 고쳐야 하는 백엔드 쪽 문제라 별도 PR로 분리했다.변경
app.cors.allowed-origins(CORS_ALLOWED_ORIGINS환경변수, 기본http://localhost:3000)로 허용 오리진을 설정한다.Allow-Origin: *를 쓸 수 없어 명시적 오리진 목록 +allowCredentials(true)로 구성했다.참고 (로컬 개발 시)
SameSite=Lax인데,internal.bcsdlab.com과api.internal.bcsdlab.com은 같은 eTLD+1(bcsdlab.com)이라 SameSite 기준 same-site라 운영 환경은 문제없다.http://localhost로 붙일 때는REFRESH_TOKEN_COOKIE_SECURE=false를 켜야 한다(기본값true라http://localhost에서Secure쿠키가 브라우저에 의해 버려진다). 배포 환경변수는 그대로 두면 된다.검증
./gradlew test전체 통과, 3회 연속.Refs #7 (인터널 프론트 T-26), 브랜치는
feat/t18-track-members(#72) 위에 스택 — T-14~T-18까지 포함된 상태입니다.머지하지 않습니다. 부원 리뷰 후 직접 머지 예정입니다.