Nginx 크로스 도 메 인, session, 쿠키 가 잘못 되 었 습 니 다.

문제 배경
이틀 동안 이러한 수 요 를 만 났 다. 두 항목 ab 이 있 고 a 프로젝트 에서 페이지 호출 b 중의 인터페이스 가 있 으 며 두 항목 의 도 메 인 이름 은 각각 a.com, b.com 이다.이때 직접 호출 하면 분명히 도 메 인 을 넘 었 다.한바탕 고생 한 후에 문제 가 해결 되 었 으 니, 여기에 해결 방법 을 기록 해라.
해결 방법
첫 번 째, 크로스 도 메 인 해결
이것 은 Nginx 의 프 록 시 기능 을 사용 하면 됩 니 다. a 서버 의 Nginx 에 다음 예제 설정 을 추가 합 니 다.
location ~ /xxx/ { proxy_pass http://b.com ; }
이렇게 해서 경로 에 있 는 /xxx/ 요청 을 모두 b.com 로 옮 겼 다.쿠키 를 저장 하지 않 고 session 같은 기능 을 유지 하면 됩 니 다.그러나 이 프로젝트 는 쿠키 를 사용 해 야 하기 때문에 다음 내용 이 있 습 니 다.
두 번 째 단계, domain 설정
쿠키 에는 domain 이 있 기 때문에 두 서버 는 일반적으로 다르다. 예 를 들 어 a 서버 가 돌아 오 는 Response Headers 는 Set-Cookie:JSESSIONID=_3y4u02v4cbpBw10DoCrMSnjg7m34xuum1XRWBF1Uno; path=/; domain=a.com 이 고 b 서버 가 돌아 오 는 것 은 Set-Cookie:JSESSIONID=_3y4u02v4cbpBw10DoCrMSnjg7m34xuum1XRWBF1Uno; path=/; domain=b.com 이다. 이때 a 프로젝트 의 페이지 가 b 인 터 페 이 스 를 호출 하면 브 라 우 저 는 인터페이스 가 돌아 오 는 domain 이 a.com 이 아니 라 는 것 을 발견 하면 쿠키 를 저장 하지 않 는 다.세 션 도 무효 야.Nginx 는 이 문 제 를 해결 하기 위해 proxy_cookie_domain 를 도입 했다.예시:
location ~ /xxx/ { proxy_cookie_domain b.com a.com ; proxy_pass http://b.com ; }
이렇게 하면 Nginx 가 요청 을 받 을 때 domain 의 b.coma.com 로 자동 으로 변환 할 수 있 고 쿠키 설정 이 성공 할 수 있 습 니 다.
하지만 이렇게 빛 이 바 뀌 지 않 는 경우 도 있다.예 를 들 어 b 프로젝트 의 domain 은 .b.com 이 고 앞 에 작은 점 이 하나 더 있 으 면 해당 하 는 것 은 proxy 로 바 꿉 니 다.cookie_domain .b.com a.com ; 안 돼 요?실천 을 통 해 안 돼!!
Nginx 문 서 를 보고 해결 방법 을 찾 았 습 니 다.사실, 위의 설정 방식 을 제외 하고 Nginx 는 정규 설정 도 지원 합 니 다.
location ~ /xxx/ { proxy_cookie_domain ~\.?b.com a.com ; proxy_pass http://b.com ; }
이렇게 하면 domain 중의 .b.coma.com 로 바 꿀 수 있다.
세 번 째, path 설정
정상 적 인 상황 에서 상기 두 단 계 를 완성 하면 됩 니 다. 쿠키 의 path 는 일반적으로 path=/, 즉 모든 요청 이 본 쿠키 에 접근 할 수 있 기 때 문 입 니 다.그러나 일부 서버 는 특정한 등급 의 요청 만 쿠키 에 접근 할 수 있 도록 지정 합 니 다. 예 를 들 어 Set-Cookie:JSESSIONID=_3y4u02v4cbpBw10DoCrMSnjg7m34xuum1XRWBF1Uno; path=/sub/; domain=b.com 그러면 상대 적 인 루트 경로 만 허용 하고 / sub / 로 시작 하 는 요청 경로 만 쿠키 에 접근 할 수 있 습 니 다.이 럴 때 쿠키 가 잘못 되 었 을 수도 있 습 니 다. 이 문 제 를 해결 하기 위해 사용 할 수 있 습 니 다 proxy_cookie_path.예시:
location ~ /xxx/ { proxy_cookie_domain ~\.?b.com a.com ; proxy_cookie_path /sub/ / ; proxy_pass http://b.com ; }
이렇게 해서 /sub/ 등급 의 요청 만 쿠키 에 접근 할 수 있 도록 하고 모든 요청 이 쿠키 에 접근 할 수 있 도록 합 니 다.
총결산
몇 시간 을 괴 롭 혔 지만 Nginx 공식 문서 에서 해결 방안 을 찾 았 다.이렇게 많아본문 이 너 에 게 도움 이 되 기 를 바란다.
비고
Nginx 문서 발췌 내용:
Syntax: proxy_cookie_domain off; proxy_cookie_domain domain replacement ; Default: proxy_cookie_domain off; Context: http, server, location
This directive appeared in version 1.1.15.
Sets a text that should be changed in the domain attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the “Set-Cookie” header field with the attribute “domain=localhost”. The directive
proxy_cookie_domain localhost example.org ;
will rewrite this attribute to domain=example.org .
A dot at the beginning of the domain and replacement strings and the domain attribute is ignored. Matching is case-insensitive.
The domain and replacement strings can contain variables:
proxy_cookie_domain www.$host $host ;
The directive can also be specified using regular expressions. In this case, domain should start from the “~” symbol. A regular expression can contain named and positional captures, and replacement can reference them:
proxy_cookie_domain ~\.(?P[-0-9a-z]+\.[a-z]+)$ $sl_domain ;
There could be several proxy_cookie_domain directives:
proxy_cookie_domain localhost example.org ; proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1 ;
The off parameter cancels the effect of all proxy_cookie_domain directives on the current level:
proxy_cookie_domain off; proxy_cookie_domain localhost example.org ; proxy_cookie_domain www.example.org example.org ;
proxy_cookie_path off; proxy_cookie_path path replacement ;
Default:
proxy_cookie_path off; Context: http, server, location
This directive appeared in version 1.1.15.
Sets a text that should be changed in the path attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the “Set-Cookie” header field with the attribute “path=/two/some/uri/”. The directive
proxy_cookie_path /two/ / ;
will rewrite this attribute to “path=/some/uri/”.
The path and replacement strings can contain variables:
proxy_cookie_path $uri /some$uri ;
The directive can also be specified using regular expressions. In this case, path should either start from the “~” symbol for a case-sensitive matching, or from the “~*” symbols for case-insensitive matching. The regular expression can contain named and positional captures, and replacement can reference them:
proxy_cookie_path ~*^/user/([^/]+) /u/$1 ;
There could be several proxy_cookie_path directives:
proxy_cookie_path /one/ / ; proxy_cookie_path / /two/ ;
The off parameter cancels the effect of all proxy_cookie_path directives on the current level:
proxy_cookie_path off; proxy_cookie_path /two/ / ; proxy_cookie_path ~*^/user/([^/]+) /u/$1 ;
참고 문서:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain

좋은 웹페이지 즐겨찾기