2011-09-09 2 views
2

바니쉬와 함께 작동하기 위해 스프링 세이프의 remember-me 기능을 얻으려고하고 있지만 이것은 매우 힘들어 보입니다. 정기적 인 로그인을 사용하면 쉽고 간단히 설정하여 j_spring_security_check URL에 대한 캐시를 무시할 수 있지만 remember-me에서는 모든 URL이 로그인의 진입 점이 될 수 있습니다. 사용자가 브라우저를 열 때 가장 먼저하는 일은 Varnish가 건너 뛴 (즉, 캐시를 우회하는) URL이며 모든 것이 정상이지만 사용자가 홈페이지 (또는 Varnish 캐시)에 도달하면 이상한 일이 발생합니다. while 사용자가 로그인하면 CookieTheftException이 발생하고 remember-me 쿠키가 취소되므로 추가 자동 로그인이 불가능합니다. 생각할 때,이 두 가지 (기억 나니니스)가 단순히 함께 작동하지 않을 수 있습니다. 이것이 사실 일 수 있습니까?Remember-me 쿠키 및 바니시

어떤 아이디어가 잘못되었을 수 있습니까? Varnish와 함께 작업하기 위해 어떻게 기억을 유지할 수 있습니까? 해시 함수가 문제가 될 수 있습니까?

나는 (당신이 관련이 생각한다면, 말 해주세요 해시 함수 정의를 생략) 이하 나의 니스의 CONFIGS의 일부를 게시하도록하겠습니다 : 나는 잘 here 내 최종 구현을 문서화 :

sub vcl_recv { 
    # Forward IP to Apache log 
    unset req.http.X-Forwarded-For; 
    set req.http.X-Forwarded-For = client.ip; 

     if (req.http.host ~ "(?i)mysite\.com$") { 
     if (req.restarts == 0) { 
        set req.backend = mysite; 
     } 
     else { 
      error 750 "mysite"; 
     } 
    } 

    # static content should always be cached 
    if (req.url ~ "\.(js|css|gif|jpg|jpeg|png|swf|flv|txt|pdf|mp3)$") { 
     unset req.http.Cookie; 
     return(lookup); 
    } 

    # only cache "get" or "head" requests 
    if (req.request != "GET" && req.request != "HEAD") { 
     return (pass); 
    } 

    # do not cache http authentication 
    if (req.http.Authorization || req.http.Authenticate) { 
     return (pass); 
    } 

    # do not cache Spring Security URLs, esi, personal pages etc. 
     if (req.url ~ "^(/logout|/j_spring_security_check|/personal/)" || req.url ~ "\?service=esi") { 
      return(pass); 
    } 

    return (lookup); # skip default vcl_recv 
} 

sub vcl_fetch { 
    # Try again if backend not responding 
    if (beresp.status != 200 && beresp.status != 403 && beresp.status != 404 && beresp.status != 301 && beresp.status != 302 && beresp.status != 401) { 
     return(restart); 
    } 

    # block sensitive files 
    if (req.url ~ "\.(bak|conf|config|ear|exe|gz|jar|log|old|properties|tar|tmp|tgz|war)$") { 
     error 405 "Not allowed"; 
    } 

    # do esi processing for all non-static resources 
    if (req.url !~ "\.(js|css|gif|jpg|jpeg|png|swf|flv|txt|xml|html|htm|pdf|mp3|doc)$") {  
     esi; 
    } 

    # do not cache when told not to 
    if (req.http.Cache-Control ~ "no-cache") { 
     return (pass); 
    } 

    # do not cache Spring Security URLs, esi, personal pages etc. 
    if (req.url ~ "^(/logout|/j_spring_security_check|/personal/)" || req.url ~ "\?service=esi") { 
     set beresp.http.Cache-Control = "private, no-cache, no-store, must-revalidate"; 
     set beresp.http.Pragma = "no-cache"; 
     set beresp.http.Expires = "Sat, 01 Jan 2000 00:00:00 GMT"; 
     return(pass); 
    } 

    # static content should always be cached 
    if (req.url ~ "\.(js|css|gif|jpg|jpeg|png|swf|flv|txt|xml|html|htm|pdf|mp3|doc)$") { 
     unset beresp.http.set-cookie; 
     set beresp.ttl = 1h; 
    } else { 
     set beresp.ttl = 300s; 
    } 
} 

UPDATE.

답변

2

RememberMe 기능은 서버에 특수 쿠키를 보내어 작동합니다. 서버는 쿠키 값을 해석하는 방법을 알고 있습니다 (예 : 사용자 이름 + 비밀번호가 여기에 코드화되어 있거나 영구적 인 토큰이 사용자에게 연결되어 있음). 사용자 로그인을 할 수 있습니다.

기본적으로 (default.vcl) Varnish는 쿠키가 포함 된 요청을 방해하지 않으므로 통과됩니다. 그러나 vcl 파일은 요청 쿠키를 보지 않으며 varnish에게 어쨌든 조회를 수행하도록 지시합니다 (vcl_recv에서). 모든 클라이언트에는 (세션) 쿠키가있을 수 있으므로 모든 경우가 아닌 많은 경우에 요청 쿠키를 무시하는 것이 좋습니다.

귀하의 vcl 파일은 vcl_recv에서 rememberme 요청 쿠키를 감지하고 이에 따라 패스를 수행해야합니다. (그러나 확인 쿠키 이름)와 같은 뭔가 :

if (req.http.Cookie ~ "rememberme=") { 
    return (pass); 
} 

당신이 CookieTheftExceptions을 가진 유지하는 경우는 설정 쿠키 헤더가 포함 된 응답을 캐시하는 경우 또한, 확인합니다. 이렇게하면 사람들은 같은 세션으로 끝납니다 ...

+1

저는 같은 줄을 생각하고있었습니다 ...하지만 스프링 쿠키가있는 모든 요청에 ​​대해 캐시를 건너 뛰는 것은 공격적으로 보였습니다. 그래서 이것은 내가 한 행동입니다. 나는 성공적인 로그인에 추가 쿠키를 추가하기 위해 Spring을 수정했다. 이 쿠키는 임시이므로 브라우저가 닫을 때 삭제됩니다. REMEMBER_ME 쿠키를 포함하지만이 새로운 쿠키가없는 요청에 대해 바니시 스킵 캐시를 만들었습니다. 이렇게하면 로그인 시도는 변경되지 않지만 나머지는 여전히 정기적으로 캐시됩니다. 사용자가 쿠키를 모두 사용 중지하더라도 여전히이 규칙을 실행하지 않으므로 충분히 안전하다고 판단됩니다. 이 접근법에 대해 어떻게 생각하십니까? – kaqqao

+0

충분히 똑똑하기 때문에 정상적으로 작동합니다. 또한 부실 세션/기억 쿠키를 고려하십시오. 백엔드 (예 : 만료 된 SESSIONID 또는 잘못된 기억 장치 쿠키)에서 쿠키를 삭제해야 캐싱이 최적화됩니다. – ivy

+0

흠 ... 방금 다시이 문제에 대해 생각해 봤습니다. 사용자의 REMEMBER_ME 쿠키 값을 해시 계산에 포함하면 도움이 될까요? – kaqqao