Spring Boot와 React를 사용하여 프로젝트를 진행하는 도중 배포 환경에서 문제가 생겼다. Spring Security와 JWT를 이용해 회원 서비스를 구현했는데 프론트 엔드의 요청에 token값이 서버로 전달되지 않는 문제가 발생했다. 이유는 Nginx에 있었다.
문제점
Nginx는 HTTP의 헤더에서 언더스코어'_'를 제거한 뒤 Spring Boot 서버로 보낸다. 이유는 언더스코어'_'와 대시'-'가 모두 언더스코어로 매핑되기 때문이다. 우리는 헤더를 'access_token'이라고 지었다. 이 때문에 헤더가 제거된 채 서버에 요청을 보낸 것이 문제였다. 해당 문제는 간단하게 해결할 수 있다.
해결 방법
/etc/nginx/nginx.conf 파일에
http ➡ server 위치에 아래 문장을 넣어주면 언더스코어를 제거하지 않는다.
underscores_in_headers on;
헷갈리면 내가 작업하는 nginx.conf에서 위치를 알 수 있는 이미지를 참고하면 도움이 될 것이다.
HTTP 헤더 naming convention
HTTP 표준 얘기가 나와서 사용자 정의 HTTP Header를 지을 때 지켜야 할 규칙을 알아보았다. RFC6648이라는 표준에서 헤더 앞에 X-를 붙이게 하는 것을 제안했지만 현재는 권장되지 않는다. 프로젝트에 맞는 이름을 지으면 될 것 같다. 하지만 Nginx도 그렇고 표준 헤더들은 대시'-'로 이루어져 있으니 이를 따르자.
참고