저는 Chrome에서만 403 문제를 해결하려고 머리를 부딪혔습니다. tomcat8에서 실행 중인 애플리케이션이 있고 Nginx를 사용하여 실행하고 있습니다. 머신은 클라이언트와 함께 호스팅되며 환경에 뭔가가 있을 수 있다고 생각합니다. 하지만 그들에게 돌아갈 무언가가 필요합니다..
애플리케이션에 로그인할 수 있습니다. 일부 jquery ajax가 나에게 403을 얻는 나머지 API를 호출하도록 하는 검색 페이지가 있습니다.
Firefox와 IE에서는 모든 것이 잘 작동합니다. 하지만 크롬과 사파리에서는 403을 얻습니다.
나는 Ajax에서 전화를 걸기 때문에 CORS일지도 모른다고 생각했습니다. Chrome에서 웹 보안을 비활성화해도 아무 일도 일어나지 않았습니다. 그래서 나는 그것이 그것이라고 확신하지 않습니다 ..
내 구성은 다음과 같습니다
Nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/proxy_params;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
내 server.conf
server {
server_name myapp.mydomain.com;
root /var/www/tomcat8/webapps/myapp/;
location / {
index index.html index.jsp;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080/;
}
}
server {
listen 80;
server_name myapp.mydomain.com;
return 404; # managed by Certbot
}
내 서비스 호출의 403에 대한 nginx 로그 항목은 다음과 같습니다.
172.16.1.1 - - [19/Jul/2019:16:30:49 -0400] "POST /myap/services/search/lookupUI? HTTP/1.1" 403 0 "https://myapp.mydomain.com/myapp/gui/findpatients.jsp" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
nginx 로그의 서비스 호출에는 GET 및 POST 옵션이 모두 있습니다. 브라우저 주소 표시줄에 GET을 전달하면 작동합니다.
나는 이것이 무엇인지에 대해 지푸라기를 당기고 있습니다. 이것은 제가 다른 클라이언트와 함께 사용하는 매우 간단한 nginx 프록시 구성입니다.
어떤 도움이라도 정말 감사하겠습니다.
답변1
TL;DR
Proxy_pass 지시어를 사용하여 서버 블록에 이를 추가합니다.
proxy_set_header Origin "";
프로세스
저도 똑같은 문제가 있어서 구글링하다가 님의 글을 발견했습니다. 빠른 해결책을 찾는 것을 포기한 후 다음을 수행했습니다.
먼저 요청이 Tomcat으로 전달되었는지 확인했습니다. (저는 tomcat에 docker를 사용하므로 인터페이스는 docker0입니다.ifconfig
요청이 어떤 인터페이스를 통과하는지 파악하는 데 사용합니다)
이렇게 하면 터미널에 다소 친숙하지 않은 형식으로 요청이 표시됩니다.
sudo tcpdump -i docker0 -nnSX port 8080
그러면 현재 디렉터리에 "dump.pcap" 파일이 생성되며 Wireshark를 사용하여 컴퓨터에 복사하여 볼 수 있습니다.
sudo tcpdump -i docker0 -w dump.pcap port 8080
나는 요청이 잘 진행되는 것을 보았고 Tomcat이 내 Java 코드에 도달하기도 전에 요청을 거부하는 것을 좋아하지 않았습니다.
그런 다음 Firefox와 Chrome 모두에서 개발자 도구(ctrl - Shift - i)를 사용하여 실제 요청을 확인했습니다. "네트워크" 탭으로 이동하여 실패한 요청을 찾으세요. "요청 헤더"를 찾아 Firefox에서 "Raw headers"를 클릭하거나 Chrome에서 "소스 보기"를 클릭하고 이를 메모장++나 줄을 정렬할 수 있는 다른 편집기에 복사하세요. (편집 -> 라인 작업 -> 사전순으로 라인 정렬)
실제로 헤더의 차이로 인해 이 문제가 발생했는지 다시 확인하기 위해 Postman을 사용하여 실패한 URL에 대해 두 헤더 세트를 모두 테스트했습니다. Postman에는 헤더에 붙여넣을 수 있는 헤더 대량 편집 기능이 있습니다.
어떤 헤더가 오류를 일으켰는지 알아내는 것은 단지 제거의 문제였습니다. 처음에는 Chrome이 Origin 헤더를 보내지 않도록 Javascript 코드를 변경하는 것을 고려했지만 Nginx가 헤더를 제거하도록 하는 것이 더 쉽고 안정적이라고 생각했습니다. 이를 수행하는 방법을 빠르게 Google에서 검색해 보았더니 거기에 있습니다.
이것이 도움이 되었기를 바랍니다!
답변2
나에게 도움이 된 것은 이 프록시 지시어를 추가한 것입니다. Proxy_set_header Host $http_host;
또한 필요하지 않은 일부 항목을 정리했습니다. 결과 구성은 다음과 같습니다.
server {
server_name myapp.mydomain.com;
root /var/www/tomcat8/webapps/myapp/;
location / {
index index.html index.jsp;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8080/;
}
listen 80;
}