바니시 - 쿠키 분리 및 부착

바니시 - 쿠키 분리 및 부착

우선 이것이 가능한지 아닌지 알아보려고 합니다.

따라서 Varnish에 쿠키가 있으면 개체를 캐시하지 않는다는 것을 알 수 있습니다.

들어오는 요청에 쿠키가 있는 경우 Varnish는 이를 변수에 저장하고 해당 쿠키를 제거한 다음 백엔드로 전달합니다. 백엔드에서 처리가 완료되면 Varnish는 쿠키를 다시 넣습니다.

이게 가능한 일인가요?

그렇다면 vcl은 어떻게 생겼나요?

답변1

문맥

Varnish는 캐싱과 관련하여 보수적이며 쿠키 사용이 응답의 개인화 수준을 의미한다고 가정합니다.

개인화된 응답을 캐싱하면 개인 정보 보호 또는 보안 문제가 발생할 수 있습니다. 또한 일관성 없는 출력이 발생할 수도 있습니다.

장바구니가 있는 페이지를 캐싱한다고 상상해 보세요. 전체 페이지를 캐싱하면 모든 사람이 동일한 장바구니 값을 갖게 됩니다.

쿠키용 Varnish에 내장된 VCL 동작은 다음과 같습니다.

  • CookieVarnish는 요청에서 헤더를 볼 때 콘텐츠가 개인화되어 있다고 가정하기 때문에 캐시에서 객체를 제공하지 않습니다.

보다https://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#authorization-headers-and-cookies-are-not-cacheable

  • Set-CookieVarnish가 응답에서 헤더를 볼 때 쿠키 설정은 개인화를 의미하는 상태 변경이므로 개체를 캐시에 저장하지 않습니다.

보다https://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers

쿠키 제거

응답 헤더를 통해 쿠키가 설정되면 쿠키 는 실제로 이러한 쿠키가 필요하지 않은 페이지에도 불구하고 모든 후속 요청에 대한 요청 헤더 Set-Cookie로 전달됩니다 .Cookie

그렇기 때문에 쿠키가 필요한 페이지와 그렇지 않은 페이지를 결정하는 것이 중요합니다. 추적 쿠키는 서버가 아닌 클라이언트에서 Javascript로 처리되므로 식별하는 것도 마찬가지로 중요합니다.

다음은 서버에 필요한 쿠키를 제외한 모든 쿠키를 제거하는 VCL 예제입니다.

vcl 4.1;

sub vcl_recv {
    if (req.http.Cookie) {
        set req.http.Cookie = ";" + req.http.Cookie;
        set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
        set req.http.Cookie = regsuball(req.http.Cookie, ";(PHPSESSID)=", "; \1=");
        set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
    }
    if (req.http.cookie ~ "^\s*$") {
        unset req.http.cookie;
    }
}

이 경우 PHPSESSID로그인을 추적하는 데 필요하므로 쿠키만 보관됩니다. 교체 논리 후에도 이 쿠키가 여전히 존재하는 경우 Varnish는 캐시에서 응답을 제공하지 않습니다. 이 쿠키가 설정되지 않았지만 여러 개의 추적 쿠키가 있는 경우 모든 쿠키가 제거되고 페이지는 캐시에서 제공될 수 있습니다.

특정 페이지의 쿠키 제거

이전 예에서는 선택한 쿠키를 제거하고 PHPSESSID쿠키만 유지하는 기능을 제공했지만 실제로 해당 세션 쿠키가 필요하지 않은 페이지에 계속 표시될 수 있습니다.

다음은 관리 페이지 및 장바구니 페이지와 같이 실제로 특정 쿠키가 필요한 페이지를 제외하고 쿠키가 완전히 제거되는 VCL 예입니다.

vcl 4.1;

sub vcl_recv {
    if(req.url ~ "^/admin" || req.url == "/cart") {
        return(pass);
    }
    unset req.http.Cookie;
}

Set-Cookie 헤더 제거

에 표시된대로https://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers, 내장 VCL은 Set-Cookie헤더가 사용되는 경우 상태 변경을 의미하므로 캐시에 객체를 저장하지 않습니다.

그러나 이는 페이지가 캐시에 저장되지 않는다는 의미는 아닙니다. Set-Cookie쿠키가 이미 설정되어 있으므로 다음 백엔드 응답에는 헤더가 포함되지 않을 가능성이 높습니다. 이 경우 Set-Cookie헤더가 없는 다음 응답이 캐시에 남을 수 있습니다.

그러나 특정 페이지에 쿠키를 설정할 필요가 없다고 확신하는 경우 헤더를 제거하기로 결정할 수도 있습니다 Set-Cookie.

다음 예에서는 백엔드가 정적 콘텐츠에 대한 쿠키를 설정하지 못하도록 방지합니다.

vcl 4.1;

sub vcl_backend_response {
    if (bereq.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|ogg|ogm|opus|otf|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
        unset beresp.http.Set-Cookie;
    }
}

쿠키 다시 연결

헤더에 쿠키 값을 저장한 다음 캐시에서 제공하기 위해 VCL에서 쿠키를 제거하고 최종적으로 백엔드 요청에 다시 연결하는 것이 가능하지만 실제로는 의미가 없습니다.

캐시 가능한 응답에 출력을 생성하는 데 쿠키가 필요하지 않은 경우 백엔드 요청에 대해 쿠키를 보내는 이유는 무엇입니까?

백엔드 요청에 출력을 구성하기 위해 쿠키 값이 필요한 경우 응답을 캐시할 수 없다는 의미일 수 있으므로 해당 요청에 대해 캐시를 완전히 우회할 수도 있습니다.

다음 단계

귀하의 질문이 그다지 구체적이지 않았기 때문에 저도 매우 일반적인 답변을 드려야 했습니다.

제 답변이 귀하의 질문에 완전히 답변된 경우 사용 사례에 대해 더 자세한 내용을 지정해 주시면 더 자세한 답변을 드리겠습니다.

관련 정보