Express.js에서 Node.js를 사용하는 세션은 어떻게 작동합니까?


96

Express.js를 사용하면 세션이 매우 간단합니다. 실제로 어떻게 작동하는지 궁금합니다.

클라이언트에 쿠키를 저장합니까? 그렇다면 그 쿠키는 어디에서 찾을 수 있습니까? 필요한 경우 어떻게 디코딩합니까?

기본적으로 사용자가 실제로 사이트에 없었을 때에도 사용자가 로그인했는지 확인할 수 있기를 원합니다 (예 : 다른 사이트에있을 때 페이스 북이 로그인 한 상태임을 어떻게 알 수 있는지). 하지만 세션이 어떻게 작동하는지 먼저 이해해야한다는 것을 이해해야합니다.

답변:


43

주제에 대한 문서 에 따르면 다음과 같이 들리지만 Express.js를 사용한 적이 없습니다 .

  • 쿠키는 키 (서버가 세션 데이터를 검색하는 데 사용함) 및 해시 (서버가 쿠키 데이터가 변조되지 않았는지 확인하는 데 사용할 것임)와 함께 클라이언트에 저장됩니다. 쿠키가 유효하지 않을 값)

  • 일부 프레임 워크 (예 : Play Framework !) 와 달리 세션 데이터 는 서버에 보관되므로 쿠키는 실제 세션 데이터의 보유 자라기보다는 세션의 자리 표시 자에 가깝습니다.

  • 에서 여기 서버에서이 세션 데이터가 메모리에 기본적으로처럼 그가 어떤 저장 형태로 구현 적절한 API에 변경 될 수 있지만, 그것은 보인다.

따라서 req말했듯 이 특정 요청 객체 없이 항목을 확인하려면 동일한 저장소에 액세스하면됩니다. 첫 번째 문서 페이지의 맨 아래에는 스토리지가 구현해야하는 필수 메소드가 자세히 설명되어 있으므로 스토리지 API에 익숙 .getAll()하다면 이와 유사한 것이 존재 하는 경우 실행 하고 세션 데이터를 반복하여 읽을 수 있습니다. 원하는 값.


166

개요

Express.js는 쿠키를 사용하여 사용자의 브라우저에 세션 ID (암호화 서명 포함)를 저장 한 다음 후속 요청에서 해당 쿠키의 값을 사용하여 서버에 저장된 세션 정보를 검색합니다. 이 서버 측 저장소는 메모리 저장소 (기본값) 또는 필요한 메서드 (예 : connect-redis ) 를 구현하는 다른 저장소 일 수 있습니다.

세부

Express.js / Connect는을 사용하여 24 자 Base64 문자열을 utils.uid(24)만들고 req.sessionID. 이 문자열은 쿠키의 값으로 사용됩니다.

고객 입장에서

서명 된 쿠키는 항상 세션에 사용되므로 쿠키 값의 형식은 다음과 같습니다.

[sid].[signature]

여기서 [sid]는 세션 ID이고 [signature]는 세션 미들웨어 초기화시 제공된 비밀 키를 사용하여 [sid]에 서명하여 생성됩니다. 서명 단계는 변조를 방지하기 위해 수행됩니다. 사용 된 비밀 키에 대한 지식없이 [sid]를 수정 한 다음 [signature]를 다시 만드는 것은 계산적으로 실행 불가능해야합니다. 세션 쿠키는 [sid] 수정이 필요하지 않은 경우 여전히 도난 및 재사용에 취약합니다.

이 쿠키의 이름은

connect.sid

서버 측

cookieParsersession미들웨어 다음에 핸들러가 발생 하면 변수에 액세스 할 수 있습니다 req.cookies. 여기에는 키가 쿠키 키이고 값이 쿠키 값인 JSON 개체가 포함됩니다. 여기에는 이름이 지정된 키가 포함 connect.sid되며 해당 값은 서명 된 세션 식별자가됩니다.

다음은 모든 요청에서 세션 쿠키의 존재를 확인하고 해당 값을 콘솔에 인쇄하는 경로를 설정하는 방법의 예입니다.

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

또한 구성 섹션 app.use(app.router)cookieParser와 뒤에 라우터 ( )가 포함되어 있는지 확인해야합니다 session.

다음은 Express.js / Connect에 의해 내부적으로 저장된 데이터의 예입니다.

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

user필드는 사용자 정의이다. 다른 모든 것은 세션 관리의 일부입니다.

예는 Express 2.5에서 가져온 것입니다.


1
console.log로 쿠키 값을 인쇄 할 때 인코딩 된 (서명 된) 쿠키를 제공합니다. 실제 정보는 어떻게 얻습니까?
vsync

무슨 뜻입니까? "[sid]를 수정할 필요가없는 경우 세션 쿠키는 여전히 도난 및 재사용에 취약합니다."? SID는 express에 의해 생성 되었기 때문에 절대 변경할 수 없습니까?
Hrushikesh 2013

2
: @WebHrushi 나는 man-in-the-middle 공격의 생각 en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

누군가가이 질문에 대해 저를 도울 수 있습니까? stackoverflow.com/questions/21982791/…
roundrobin

특정 session_id에 대한 토큰을 어떻게 생성합니까?
aman verma

9

실제로 어떻게 작동하는지 궁금합니다.

답변과 위키 항목 을 살펴보십시오 .

클라이언트에 쿠키를 저장합니까?

예, 일반적으로 세션 ID가 할당 된 쿠키이며 위조를 방지하기 위해 비밀로 서명해야합니다.

그렇다면 그 쿠키는 어디에서 찾을 수 있습니까? 필요한 경우 어떻게 디코딩합니까?

클라이언트 측에서 세션 쿠키를 엉망으로 만들면 안됩니다. 서버 측 세션 작업 할 경우 관련 체크 아웃해야 express.js연결 문서를.


이 모든 것에 대해 의문이 있습니다.
Suraj Jain

0

이미 훌륭한 답변 외에도 Express 세션, 쿠키 및 상점과의 링크를 설명하기 위해 만든 2 개의 다이어그램이 있습니다.

  • 초콜릿 쿠키 : 초콜릿
  • 딸기 쿠키 : 딸기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.