Post

[Spring] React-Spring 통신, Axios Response header의 값이 없는 경우

[React-Spring 통신] Axios Response header의 값이 없는 경우

Issue

  • React-Spring FE-BE 프로젝트에서 로그인/회원가입 API 기능 구현은 완료, 백엔단 배포도 완료된 상태
  • 스프링 백엔단에서 https로 배포한 뒤에 jwt 토큰을 쿠키에 저장해서 보내는 방식을 jwt 토큰을 헤더에 담아서 전달하는 방식으로 바꿨다.
  • 분명히 POSTMAN으로 테스트를 했을 때는 우리가 넣어준 header “Authorization”필드에 “Bearer “ + 토큰값 상태로 잘 보였다.

image

  • jwt 디코딩을 했을 때 토큰 값에도 정확한 user 정보가 잘 들어가 있었다(아래 사진 참고)
  • jwt.io 사이트

image

  • 하지만 서버에 로그인 요청을 하면 클라이언트 측 프론트단에서 헤더가 보이지 않는 것이다.
  • “Authorization”으로 응답 받지 못하는 문제가 발생했다.

해결

  • Gpt, 블로그 모두 CORS문제라고 짚었다. CORS (Cross-Origin Resource Sharing) 때문에 헤더에 접근하는 것에 제한이 걸려 Response header로 받지 못한 상황이라는 것을 알게 됐다.
  • 최대한 우리 상황과 비슷한 블로글들을 찾아보았다.
  • 서버측 코드를 수정해야한다.

react - header의 Authorization받기
Axios Response header의 값이 없는 경우

1. 먼저 서버측 CORS 코드를 살펴본다

image

  • 클라이언트의 로컬 서버가 허용할 오리진에 추가되어있고 모든 METHOD 요청을 허용하는
  • config.addAllowedMethod("*");도 추가 돼있었다.
  • source.registerCorsConfiguration("/api/**", config); 경로에 따라 다르지만
  • 우리 프로젝트에서는 api/member, api/interior를 사용하기 때문에 api로 시작하는 경로에 cors를 허용해주는 코드도 넣었다.

2. 클라이언트가 응답에 접근할 수 있는 header 추가

image

  • MDN 문서를 참고해보면 헤더 값은 정확하게 명시를 해줘야한다.

Expose-Headers

  • 응답 Access-Control-Expose-Headers헤더를 사용하면 서버는 요청에 대한 응답으로 브라우저에서 실행 중인 스크립트에 어떤 응답 헤더를 사용할 수 있는지 나타낼 수 있다.
  • CORS 허용 목록에 포함된 응답 헤더만 노출이 되기 때문에 클라이언트가 다른 헤더를 엑세스 하기 위해서는
  • 포트를 허용해주며 열어줬듯이 우리가 사용하는 “Authorization” 헤더를 열어줘야 했던 것이다

3. setAllowCredentials(true) 설정 추가

  • CORS 정책은 보안 상의 이유로 기본적으로 브라우저가 다른 출처에서의 요청에 대해 인증 정보를 포함하지 않도록 막는다.
  • setAllowCredentials(true)를 설정하면 브라우저는 인증 정보를 요청에 포함하도록 허용하게 됨.
  • 헤더에 토큰을 담아서 보내는 경우, 이 토큰은 CORS 정책에 따라 브라우저에 의해 요청 헤더에 포함된다.
  • 서버는 이 토큰을 검증하고 필요에 따라 인증하게 되는 것.

image

4. 회고

이번에 계속 React-Spring 통신을 하면서 CORS 오류를 많이 접하게 되면서 느꼈던 점은
서버측 입장에서 API 작성하고 ERD 구성하고 토큰이나 전달 소스도 잘 보인다고 던져주면 끝인 게 아니라
클라이언트 측에서 잘 받아지는지까지 확인하고 서버측에서 어떻게 설정을 해서 보내야 받을 수 있는지
코드를 짤 때 클라이언트 입장에서 한 번 더 생각해보게 되는 계기가 되었다.
생각보다 설정해줘야 할 것이 많고 트러블도 많았지만 포트 열어주고 사용하는 헤더를 직접 열어주고 하는 것이
보안상 당연한 절차임을 깨달았다.

This post is licensed under CC BY 4.0 by the author.