nginx auth_request 캐싱

nginx auth_request 캐싱

마이크로서비스에 대한 요청을 1.12.2사용 auth_request하고 인증하기 위해 nginx 역방향 프록시를 구성하려고 합니다 . 최종 사용자는 요청과 함께 proxy_cache간단한 토큰을 보내고 서버는 계속 진행이 허용되는지 확인하기 위해 이를 사용하여 리소스를 가져오려고 시도합니다. Bearer해당 리소스 가져오기는 인증 엔드포인트의 부하를 줄이기 위해 특정 토큰에 대해 캐시되어야 합니다. 지금까지 내 구성은 다음과 같습니다.

ssl_certificate                 /etc/nginx/ssl/certificate;
ssl_certificate_key             /etc/nginx/ssl/key;
proxy_cache_path                /var/cache/nginx/auth_cache levels=1:2 keys_zone=auth_cache:1m max_size=1g inactive=60m;
server {
    listen                      80;
    listen                      443 ssl;
    server_name                 myapi.mydomain.com;
    location / {
        proxy_pass              http://myapi/;
        auth_request            /auth;
    }
    location = /auth {
        internal;
        proxy_pass              https://authendpoint.mydomain.com/api/user/verify;
        proxy_cache             auth_cache;
        proxy_cache_key         "$http_x_auth_token$request_uri";            
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

클라이언트 관점에서 이것은 훌륭하게 작동하지만 nginx 서버를 보면 캐시 폴더에 아무 것도 기록되지 않습니다. 폴더가 /var/cache/nginx/auth_cache생성되지만 항상 비어 있습니다. 내가 무엇을 놓칠 수 있습니까?

업데이트

최신 nginx( 1.17.9현재)로 이 작업을 시도하면 캐시 폴더에 기록된 내용이 전혀 표시되지 않습니다. 다른 곳에서 쿠키가 캐싱을 차단할 수 있다는 제안을 보았습니다. 이 앱은 쿠키를 사용하지 않지만 어쨌든 시도해 보았습니다.

location = /auth {
    internal;
    proxy_pass              http://authservice/api/user/verify;
    proxy_cache             auth_cache;
    proxy_cache_key         "$http_x_auth_token$request_uri";   
    proxy_pass_request_body off;
    proxy_set_header        Content-Length "";
    proxy_set_header        X-Original-URI $request_uri;
    proxy_hide_header       Set-Cookie;
    proxy_ignore_headers    Set-Cookie;
    proxy_set_header        Cookie "";
}

여전히 같은 행동입니다. auth_cache 폴더가 생성되었지만 거기에는 아무것도 기록되지 않으며 인증 끝점에 대한 요청이 캐시되지 않습니다.

참고로 인증 엔드포인트의 결과는 극히 미미합니다.

< HTTP/1.1 200 OK
< Date: Sun, 12 Apr 2020 18:04:08 GMT
< Server: Kestrel
< Content-Length: 0

또한 처음에 이 질문을 한 이후로 원격 인증 엔드포인트를 단순화했습니다. 이제는 httpnginx 프로세스와 동일한 클러스터 내에서 실행되는 일반 리소스입니다 . 이를 반영하기 위해 위의 예를 업데이트했습니다.

최종 업데이트

만약 다른 사람이 이것을 참조로 사용하려고 할 경우 아래의 두 가지 유용한 답변 외에도 위의 예에서 캐시 키를 수정해야 했습니다.

proxy_cache_key         "$http_x_auth_token$request_uri";            

X-Auth-Token실제로 헤더가 아닌 헤더로 사용하는 경우에만 의미가 있습니다 Authorization. 위의 키는 작동하지만 모든 URI에 대한 첫 번째 프록시 인증 응답이 캐시되고 실제 토큰은 무시된다는 의미입니다. 실제로 우리에게는 다음이 필요했습니다.

proxy_cache_key         "$http_authorization$request_uri";            

답변1

NGINX를 업그레이드해 보세요.

1.14.0에서도 동일한 문제가 있었는데, 컬을 사용하여 /auth에 대한 수동 요청은 캐시되었지만 auth_request 하위 요청은 캐시되지 않았습니다.

NGINX 1.16.1로 업그레이드한 후 작동하기 시작했습니다.

답변2

저는 초보이기 때문에 댓글을 남길 수 없지만 Proxy_ignore_headers가 도움이 될 수 있습니다.

proxy_ignore_headers Expires Cache-Control;

Nginx 문서에 따르면; 프록시 서버의 특정 응답 헤더 필드 처리를 비활성화합니다.

앱 서버가 "캐싱 없음" 지침을 반환하는 경우 Nginx는 이를 존중하며 이러한 헤더를 무시하면 모든 캐싱 지침이 무시됩니다.

또한 클라이언트 시스템에서 Nginx의 http 응답 헤더에 있는 캐시 상태는 무엇입니까? BYPASS로 인해 nginx가 캐시하지 않습니다.

다시 한 번 말씀드리지만 댓글을 남길 수 없어서 죄송합니다. 가능하다면 도움을 드리고 싶었습니다.

관련 정보