DevOps/Nginx

😵‍💫토큰을 헤더에 담아 보냈는데 왜 안가!?

ಠಿ_ಠ 💻 2021. 9. 21. 01:37

문제

프로젝트에서 JWT를 사용한 인증방식을 사용했다. 따라서, 어떤 요청의 헤더에는 'access_token', 'refresh_token' 이라는 key와 그 value값이 포함되어 있었다. 또한, FCM에 사용되는 토큰도 같은 형식으로 담겨 있었다.

하지만, 토큰이 있는지 확인이 필요한 요청들에 대해서 에러코드가 리턴되는 문제가 발생했다.

 

원인

SpringSecurity에서 permitall로 설정된 요청들에 대해서는 에러가 발생하지 않는데, hasRole로 설정되어 토큰 존재 여부가 필요한 요청들에 대해서는 토큰이 없다는 에러가 발생했다. 분명히 프론트엔드단에서 토큰을 담아서 axios 요청을 보냈는데, 자꾸 토큰이 없다는 문제가 나타난 것이다.

 

모든 요청들이 Nginx를 거쳐서 전달되었는데, Nginx의 설정이 원인이었다. Nginx에서는 언더바가 담겨진 요청이 들어오면 invalid 하다고 여겨져 invalid한 헤더들을 무시하도록 default 값이 설정되어있다.

토큰의 key값을 언더바가 안들어가도록 변경해도 되지만, 나의 경우 설정 값을 바꿔 해결하고자 했다.

 

해결과정

worker_processes  1;

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    proxy_buffering off;
    
    # 이부분을 추가해서 해결했다.
    underscores_in_headers on;

    server {
        listen       80;
        server_name i5a309.p.ssafy.io;
        client_max_body_size 30M;
        keepalive_timeout 5;
        return 301 https://$server_name$request_uri;

    }
    # HTTPS server
    server {
        listen       443 default_server ssl;
        server_name  도메인주소;

		# https 적용한 내용
        ssl_certificate      /etc/letsencrypt/live/도메인주소/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/도메인주소/privkey.pem;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        location / {
             proxy_set_header X-Forwarded-For             $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto https;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header HOST $http_host;
             proxy_set_header X-NginX-Proxy true;

			 # 8080번 포트에 프론트를 올려놨다.
             proxy_pass http://도메인주소:8080;
             proxy_redirect off;
        }

        location /api {
             proxy_set_header X-Forwarded-For             $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto https;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header HOST $http_host;
             proxy_set_header X-NginX-Proxy true;

			 # 8000번 포트에 서버를 올려놨다.
             proxy_pass http://도메인주소:8000/api;
             proxy_redirect off;

             }
    }
}

underscores_in_headers on; 설정값을 추가해서 해결할 수 있었다.

위에서 말했듯이, 밑줄이 포함된 헤더를 invalid 하다고 판단하여 무시하는 기본 설정값을 valid 하다고 판단할 수 있도록 수정해 해결했다.

 

결과

등록한 헤더의 토큰값이 제대로 전달되어 에러가 사라지고 토큰 유효성 체크가 성공적으로 동작하는 것을 확인할 수 있었다.

 

출처

http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers

 

Module ngx_http_core_module

Module ngx_http_core_module Directives Syntax: absolute_redirect on | off; Default: absolute_redirect on; Context: http, server, location This directive appeared in version 1.11.8. If disabled, redirects issued by nginx will be relative. See also server_na

nginx.org