개요
현재 신규 서비스를 개발하고 있는데 빌드가 완료되어 개발서버에 배포를 진행하고 있다.
spring 기반의 서비스이며 nginx와 tomcat으로 운영하고 있는데 서비스 호출은 정상이나 몇몇 api 및 토큰 요청에 문제가 있는 상황이다.
이에 nginx 설정 중 헤더 구성에 원인이 있다고 판단하여 nginx 설정을 확인해보는 시간을 가져보겠다.
현재 구성( nginx.conf )
다음은 예시로 구성한 nginx.conf 이다.
upstream cwking {
server 192.168.100.20:8080;
}
server {
listen 80;
server_name woodev.devcw.site ;
location / {
proxy_pass http://cwking/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /robots.txt {
return 200 "User-agent: *\nDisallow: /";
}
access_log /app/weblog/woodev.devcw.site-access.log main;
error_log /app/weblog/woodev.devcw.site-error.log;
}
tomcat(spring)은 8080 포트로 동작한다고 가정하였을때,
woodev.devcw.site URL에 접근 시 root 경로로 tomcat으로 이동하도록 proxy pass를 구성하였다.
proxy_set_header 지시어로 tomcat이 요청을 처리할 때 클라이언트가 요청한 도메인, 서버 이름 등을 알 수 있게 한다.
- Host $host; : 클라이언트 요청의 Host 헤더 값을 백엔드로 전달한다.
- X-Forwarded-For $proxy_add_x_forwarded_for; : 클라이언트의 원본 IP 주소를 포함한 X-Forwarded-For 헤더를 백엔드 서버로 전달한다.
위 구성으로 실행하였을때, 서비스 동작 및 api 호출에 문제가 없었다. 그러나 몇몇 호출이나 토큰 응답값 등을 전달/받아오지 못하는 현상이 발생하였는데, 다음과 같이 수정하여 해결하였다.
수정된 구성( nginx.conf )
upstream cwking {
server 192.168.100.20:8080;
}
server {
listen 80;
server_name woodev.devcw.site ;
# 추가 1
underscores_in_headers on;
location / {
proxy_pass http://cwking/;
# 수정 proxy_set_header Host $host;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 추가 2
proxy_pass_request_headers on;
}
location /robots.txt {
return 200 "User-agent: *\nDisallow: /";
}
access_log /app/weblog/woodev.devcw.site-access.log main;
error_log /app/weblog/woodev.devcw.site-error.log;
}
추가 및 수정된 항목에 대해 설명하겠다.
underscores_in_headers on;
밑줄이 포함된 헤더를 허용한다는 설정인데, 해당 설정을 활성화하면 클라이언트가 밑줄이 포함된 헤더를 보내도 nginx에서 이를 정상적으로 허용하여 백엔드로 전달한다.
nginx에서 기본적으로는 off 설정으로 되어있다.
! 기본적으로 _(밑줄) 헤더 호출을 차단하는 이유 :
보안 정책과 표준 HTTP 규격을 준수하기 위함인데, HTTP 표준에서는 _(밑줄) 대신 -(하이픈)을 헤더 구분자로 사용하는 것을 권장한다.
proxy_set_header Host $http_host
proxy_set_header Host 설정을 $host에서 $http_host로 변경하였다.
$host는 클라이언트 요청의 Host 헤더에 따라 변경될 수 있으나 #http_host는 클라이언트의 원본 Host 헤더 값을 전달하므로, 원래 호스트 정보가 보장된다.
(조사해보니 Spring 보안 설정에서는 토큰을 생성할 때 호스트 정보가 필요할 수 있는데, $http_host 로 설정하지 않으면 올바른 정보를 전달하지 못해 요청이 실패할 수 있다고 한다.)
proxy_pass_request_headers on;
nginx가 클라이언트의 모든 요청 헤더를 프록시로 전달하도록 한다.
이 설정이 없으면 일부 헤더가 생략되거나 기본값으로 설정될 수 있다고 한다.
인증 및 토큰 요청에서는 Authorization
이나 Cookie
같은 헤더가 필요하며, 이 헤더들이 제대로 전달되지 않으면 인증이나 세션 관리가 정상적으로 작동하지 않을 수 있다.
마무리
내가 직접 개발 서버 환경을 구성했는데 개발자분께서 로컬 환경과 동작이 다르게 나타난다고 하셔서 spring 부터 tomcat 설정 변경, 버전 변경, java 버전변경 등 모두 살펴봐도 시스템 상에서의 서비스 동작에는 아무런 문제가 없었다.
다시 개발자분과 구두로 직접 이야기해보면서 동작에 차이가 발생하는것이 헤더 호출 부분이라는 것을 듣자마자 nginx 헤더 설정에 원인이 있다고 생각되어 수정을 진행하고 정말 다행히도 빠르게 해결되어서 다행이였다.
'DevOps > open source_오픈소스' 카테고리의 다른 글
[Tomcat] Apache Tomcat 실행 시 포트 정보(HTTP/HTTPS, AJP 커넥터, Shutdown 등) (1) | 2024.11.16 |
---|---|
[Tools] 크기가 큰 텍스트 파일 열기(파일 분할) (1) | 2024.11.15 |
[NGINX] Nginx에서 Client IP(접속자 IP) 확인 방법 (0) | 2024.10.07 |
[NGINX] nginx reverse proxy (0) | 2024.09.09 |
[NGINX] 기본 구성과 Configuration (0) | 2024.09.09 |