Jak działają sesje w Express.js z Node.js?

96

Korzystając z Express.js , sesje są bardzo proste. Jestem jednak ciekawy, jak właściwie działają.

Czy przechowuje plik cookie na kliencie? Jeśli tak, gdzie mogę znaleźć to ciasteczko? W razie potrzeby, jak to zdekodować?

Zasadniczo chcę mieć możliwość sprawdzenia, czy użytkownik jest zalogowany, nawet jeśli nie ma go w danej chwili w witrynie (na przykład po tym, jak Facebook wie, że jesteś zalogowany, gdy jesteś na innych stronach). Ale przypuszczam, że rozumiem, że powinienem najpierw zrozumieć, jak działają sesje.

foobar
źródło

Odpowiedzi:

43

Nigdy nie korzystałem z Express.js, chociaż według ich dokumentacji na ten temat brzmi to tak:

  • Pliki cookie są przechowywane na kliencie wraz z kluczem (którego serwer użyje do pobrania danych sesji) i hashem (którego serwer użyje, aby upewnić się, że dane cookie nie zostały naruszone, więc jeśli spróbujesz zmienić wartość, przez którą plik cookie będzie nieważny)

  • Dane sesji, w przeciwieństwie do niektórych frameworków (np. Play Framework !), Są przechowywane na serwerze, więc plik cookie jest bardziej jak element zastępczy sesji niż do przechowywania rzeczywistych danych sesji.

  • Od tutaj , wygląda to dane sesji na serwerze jest domyślnie przechowywane w pamięci, mimo że może być zmieniona w celu utworzenia cokolwiek przechowywania wdraża odpowiednie API.

Więc jeśli chcesz sprawdzić rzeczy bez określonego reqobiektu żądania, jak powiedziałeś, musisz po prostu uzyskać dostęp do tego samego magazynu. Na dole pierwszej strony dokumentacji zawiera szczegółowe informacje o wymaganych metodach, które pamięć masowa musi zaimplementować, więc jeśli znasz interfejs API pamięci masowej, może możesz wykonać polecenie, .getAll()jeśli coś takiego istnieje, i przejrzeć dane sesji i przeczytać cokolwiek wartości, które chcesz.

davin
źródło
166

Przegląd

Express.js wykorzystuje plik cookie do przechowywania identyfikatora sesji (z podpisem szyfrowania) w przeglądarce użytkownika, a następnie, przy kolejnych żądaniach, wykorzystuje wartość tego pliku cookie do pobierania informacji o sesji przechowywanych na serwerze. Ten magazyn po stronie serwera może być magazynem pamięci (domyślnie) lub dowolnym innym magazynem, który implementuje wymagane metody (np. Connect-redis ).

Detale

Express.js / Connect tworzy 24-znakowy ciąg Base64 przy użyciu utils.uid(24)i przechowuje go w req.sessionID. Ten ciąg jest następnie używany jako wartość w pliku cookie.

Strona klienta

Podpisane pliki cookie są zawsze używane do sesji, więc wartość pliku cookie będzie miała następujący format.

[sid].[signature]

Gdzie [sid] jest identyfikatorem sesji, a [podpis] jest generowany przez podpisywanie [identyfikator] przy użyciu tajnego klucza dostarczonego podczas inicjowania oprogramowania pośredniczącego sesji. Podpisywanie ma na celu zapobieżenie manipulowaniu. Modyfikacja [sid], a następnie odtworzenie [podpisu] bez znajomości użytego tajnego klucza powinno być niewykonalne obliczeniowo. Plik cookie sesji jest nadal podatny na kradzież i ponowne wykorzystanie, jeśli nie jest wymagana modyfikacja [sid].

Nazwa tego pliku cookie to

connect.sid

Po stronie serwera

Jeśli program obsługi wystąpi po oprogramowaniu pośrednim cookieParseri session, będzie miał dostęp do zmiennej req.cookies. Zawiera obiekt JSON, którego klucze są kluczami plików cookie, a wartości są wartościami plików cookie. Będzie zawierał klucz o nazwie, connect.sida jego wartością będzie podpisany identyfikator sesji.

Oto przykład, jak skonfigurować trasę, która sprawdzi istnienie pliku cookie sesji przy każdym żądaniu i wydrukuje jego wartość na konsoli.

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

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

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

Musisz także upewnić się, że router ( app.use(app.router)) jest dołączony po cookieParseriw sessionsekcji konfiguracji.

Poniżej znajduje się przykład danych przechowywanych wewnętrznie przez Express.js / Connect.

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

userPole jest zwyczaj. Wszystko inne jest częścią zarządzania sesjami.

Przykład pochodzi z Express 2.5.

Waylon Flinn
źródło
1
podczas drukowania wartości cookie z console.log, przekazuje zakodowany (podpisany) plik cookie. jak uzyskać prawdziwe informacje?
vsync,
Co u rozumiesz przez - „Plik cookie sesji jest nadal podatny na kradzież i ponowne użycie, jeśli nie jest wymagana żadna modyfikacja [sid].”? ponieważ identyfikator SID jest generowany przez ekspres, nigdy nie możemy go zmienić, prawda?
Hrushikesh,
2
@WebHrushi Myślałem o ataku typu Man-in-the-Middle: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn
Czy ktoś może mi pomóc z tymi pytaniami: stackoverflow.com/questions/21982791/…
roundrobin
jak utworzyć token dla dowolnego identyfikatora sesji?
aman verma
9

Jestem jednak ciekawy, jak właściwie działają.

Spróbuj spojrzeć na odpowiedź i na wiki .

Czy przechowuje plik cookie na kliencie?

Tak, zwykle jest to plik cookie z przypisanym identyfikatorem sesji, który powinien być podpisany sekretem, aby zapobiec fałszerstwu.

Jeśli tak, gdzie mogę znaleźć to ciasteczko? W razie potrzeby, jak to zdekodować?

Nie powinieneś zadzierać z plikiem cookie sesji po stronie klienta. Jeśli chcesz pracować z sesjami po stronie serwera, powinieneś sprawdzić powiązane pliki express.js i connect docs.

yojimbo87
źródło
Sir, możemy porozmawiać. Mam pewne wątpliwości co do tego wszystkiego.
Suraj Jain
0

Oprócz już doskonałych odpowiedzi, oto 2 diagramy, które stworzyłem, aby wyjaśnić sesje Express, ich powiązanie z plikami cookie i sklepem:

  • czekoladowe ciastko: czekolada
  • ciastko truskawkowe: truskawka
abernier
źródło