일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- CCM
- 날솟샘
- GLS
- 웹개발
- 전산전자공학부
- FE
- 프론트엔드
- 데이터베이스
- 남재창교수님
- 찬양
- 혼자공부하는sql
- 어노인팅
- 일반화학
- SQLD
- typeScript
- dbms
- 묵상
- SQL
- 날마다 솟는 샘물
- Database
- 예배
- csee
- 유태준교수님
- 한동대학교
- Software Engineering
- 글로벌리더십학부
- 설교
- 화학
- CHEMISTRY
- QT
- Today
- Total
멈추지 않는 기록
[Spring Boot] Network 탭엔 있는데, JS에선 undefined? Authorization 헤더가 안 보이는 진짜 이유 본문
[Spring Boot] Network 탭엔 있는데, JS에선 undefined? Authorization 헤더가 안 보이는 진짜 이유
pangil_kim 2025. 5. 16. 04:20
토큰 기반 인증 시스템을 구현하다가, 아주 애매한 상황을 하나 겪었다. 무려 2시간에 걸쳐서 말이다.
서버는 분명히 Authorization 헤더를 응답에 담아서 보내주는데, 클라이언트에서는 이게 undefined로 나오는 현상이었다...
🧩 문제 상황
프론트엔드(React)에서 axios로 로그인 요청을 보내고, Spring Boot 서버는 로그인 성공 후 Authorization: Bearer ... 형식으로 accessToken을 응답 헤더에 담아 보냈다.
그리고 프론트에서는 이렇게 꺼내려고 했다.
const token = response.headers["authorization"]; // ❌ undefined
근데... 아무리 찍어봐도 undefined였다.
심지어 개발자도구(Network 탭)에서는 Authorization 헤더가 잘 보이는데도 불구하고 말이다.
🧪 내가 해봤던 시도들
이상하다 싶어서 정말 별별 걸 다 해봤다.
- 🔄 대소문자 문제인가? → authorization, Authorization 다 써봄
- 🔧 axios 설정 문제인가? → withCredentials: true 추가해봄
- 🔍 fetch로 바꾸면 될까? → fetch로도 해봤지만 여전히 안 보임
- 🧱 혹시 응답에 body가 없어서 그런가? → .body("ok")도 넣어봄
- 🧠 X-Access-Token 같은 커스텀 헤더로 복사해서 응답해봄
...그런데도 여전히 JS 코드에서는 undefined만 계속 나왔다.
🔥 문제의 본질은 CORS + Spring Filter 우선순위
결국 찾아낸 핵심 원인은 이거였다.
Spring의 WebMvcConfigurer를 이용한 CORS 설정은 브라우저가 Authorization 헤더를 노출하는 데에는 영향을 주지 못했다는 점.
이렇게만 해서는 부족했다.
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("<http://localhost:3000>")
.allowedHeaders("*")
.allowedMethods("*")
.exposedHeaders("Authorization")
.allowCredentials(true);
}
설정은 맞는데... Spring Security나 필터 체인보다 늦게 동작해서 그런지, 브라우저는 여전히 해당 헤더를 자바스크립트에 보여주지 않았다.
✅ 진짜 해결책: CorsFilter 직접 등록하기
결국 적용한 해결 방법은 CorsFilter를 직접 Bean으로 등록하는 것이었다.
이 방식은 필터 체인 앞단에서 동작하기 때문에 훨씬 강력하다는 것도 알게 되곤 했다.
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("<http://localhost:3000>");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
config.addExposedHeader("Authorization"); // ✅ 핵심!
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
🎉 이렇게 해결됐다..
서버 재시작 후 다시 요청을 보내보니, axios의 response.headers["authorization"]에서 드디어 accessToken을 확인할 수 있었다..
그동안 삽질했던 게 싹 사라지는 순간이었다.. 😇
'웹 개발 > Spring Boot' 카테고리의 다른 글
[일지] 250324 (월) (0) | 2025.03.24 |
---|---|
[일지] 250312 (0) | 2025.03.24 |
[일지] 250311 (0) | 2025.03.24 |
[일지] 240310 (2) | 2025.03.11 |