fix(security): 인증 에러 401 응답 + CORS 헤더 누락 수정 #8

병합
htlee develop 에서 main 로 2 commits 를 머지했습니다 2026-02-14 21:55:11 +09:00
소유자

Summary

  • 미인증 요청에 403 대신 401 반환하도록 AuthenticationEntryPoint 추가
  • 권한 부족 시 403 + JSON body 반환하도록 AccessDeniedHandler 추가
  • CORS 설정 범위를 /api/**/** 로 확장하여 에러 응답에도 CORS 헤더 포함
  • exposedHeadersAuthorization 추가

원인 분석

프론트엔드에서 403 에러가 발생한 원인:

  1. Spring Security 기본 Http403ForbiddenEntryPoint가 미인증 요청에 403을 반환
  2. 에러 응답에 CORS 헤더(Access-Control-Allow-Origin)가 누락되어 브라우저가 응답을 차단
  3. 프론트엔드에서는 CORS 에러로 표시됨

참고: spring-web 6.2.8 + spring-security 6.5.1 조합은 Spring Boot 3.5.2 BOM이 정의한 정상적인 버전입니다. 버전 불일치가 아닙니다.

검증 결과

테스트 수정 전 수정 후
OPTIONS preflight 200 200
GET (토큰 없음) 403 (CORS 헤더 없음) 401 + CORS 헤더 + JSON
GET /api/health 200 200 + CORS 헤더

🤖 Generated with Claude Code

## Summary - 미인증 요청에 403 대신 **401** 반환하도록 `AuthenticationEntryPoint` 추가 - 권한 부족 시 **403** + JSON body 반환하도록 `AccessDeniedHandler` 추가 - CORS 설정 범위를 `/api/**` → `/**` 로 확장하여 에러 응답에도 CORS 헤더 포함 - `exposedHeaders`에 `Authorization` 추가 ## 원인 분석 프론트엔드에서 403 에러가 발생한 원인: 1. Spring Security 기본 `Http403ForbiddenEntryPoint`가 미인증 요청에 403을 반환 2. 에러 응답에 CORS 헤더(`Access-Control-Allow-Origin`)가 누락되어 브라우저가 응답을 차단 3. 프론트엔드에서는 CORS 에러로 표시됨 > **참고**: spring-web 6.2.8 + spring-security 6.5.1 조합은 Spring Boot 3.5.2 BOM이 정의한 정상적인 버전입니다. 버전 불일치가 아닙니다. ## 검증 결과 | 테스트 | 수정 전 | 수정 후 | |--------|---------|--------| | OPTIONS preflight | 200 | 200 | | GET (토큰 없음) | 403 (CORS 헤더 없음) | 401 + CORS 헤더 + JSON | | GET /api/health | 200 | 200 + CORS 헤더 | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
htlee added 2 commits 2026-02-14 21:54:45 +09:00
- AuthenticationEntryPoint 추가: 미인증 요청에 403 대신 401 반환
- AccessDeniedHandler 추가: 권한 부족 시 403 + JSON body 반환
- CORS 설정 범위를 /api/** → /** 로 확장하여 에러 응답에도 CORS 헤더 포함
- exposedHeaders에 Authorization 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
htlee merged commit c0e33e11d7 into main 2026-02-14 21:55:11 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 1명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

의존성

No dependencies set.

Reference: gc/gc-guide-api#8
No description provided.