2013-05-10 2 views
6

cookieParser()은 변조를 막기 위해 비밀 문장으로 쿠키에 서명 할 수있는 옵션을 제공합니다. 쿠키가 변조되는 것을 방지하기 위해 쿠키에 특별한 가치가있는 것으로 알고 있습니다. cookieParser() 및 cookieSession()을 함께 사용 하시겠습니까?

가 난 그냥 서버에 저장된 쿠키 (나는 단지 그것을 성장 결코 { loggedIn = true, userId=763487246824632}를 저장)에 대안이 될 찾을 cookieSession()를 발견했다.

하지만 ... 비밀 문장이과 일치하면 cookieParser()가 "secret"로 쿠키를 설정하고 cookieSession()이 작동을 멈추는 것을 발견했습니다. . 같은 비밀을 사용하여 쿠키에 서명하면 cookieParser()가 실제로이를 취하여 구문 분석합니다.

{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true } } 

보다는 :

{ testing: 'OOO' } 

(각 다시로드가 추가 이상한 것은 cookieParser은() 비밀 같은 서명과의 작업, 그리고 을 수행되면, 세션이 설정되어 있다는 것입니다 'o') 그래서 ...

  • 분석 결과가 올바 릅니까?
  • 비밀 문안이 일치하는 경우 세션이 그 이상한 { cookie 개체로 설정된 이유를 알고 있습니까?

머.

답변

10

귀하의 분석은 정확합니다. 재현 할 수 있습니다.

문제가 cookieSession 미들웨어에 this line에 의해 발생 (일부 문맥 : options.secretcookieSession에 전달 된 핵심이다 req.secretcookieParser에 전달되는 키입니다) : 둘 다 미들웨어에게 비밀 키를 전달하는 경우, cookieSession이 찾을 것으로 가정 원시 (해석 안된) 쿠키는 req.cookies입니다.

그러나 cookieParser도 서명 된 쿠키를 선택 했으므로 (이 쿠키는 cookieSession 이전에 실행되고 있기 때문에) 쿠키 자체를 구문 분석합니다 (서명 키가 동일하고 성공하기 때문에). req.signedCookies을 삭제하고 req.cookies에서 삭제했습니다. 따라서 cookieSession까지는 쿠키가 설정되지 않습니다. 솔루션에 관해서는

app.use(express.cookieSession({ 
    cookie : { // <-- this object 
    ... 
    } 
}); 

: 각 미들웨어에 대해 다른 키를 사용하거나 하나를 통과하거나

표시되는 개체입니다 (cookieSession 구성에서 cookie 속성입니다) 기본 세션 내용입니다 그들 중 귀하의 비밀 키,하지만 둘 다 (만약 당신이 cookieParser, 모두 귀하의 쿠키가 서명됩니다 이해를 전달).

FWIW : 이것이 실제 버그인지 잘 모르겠습니다. cookieParsercookieSession 모두에 대해 동일한 서명 메커니즘을 사용하고 서로 서명 한 쿠키를 구별하지 않은 결과입니다.쿠키가 항상 req.signedCookies에 있는지 확인하여 해결할 수 있습니다.

+1

환상적이고 포괄적 인 답변입니다. 나는 그것이 꽤 벽감 문제 다라는 것을 알고있다. 그러나 그것은 +1 할 가치가있다 - 고마워! – Merc

관련 문제