S3. Session

Haizel·2023년 2월 13일
0

Front-End Developer 되기

목록 보기
64/70
post-thumbnail

01. Session


세션(Session)이란?

: 서버가 클라이이언트에 암호화된 ID를 부여하는 방식으로, 중요 데이터는 서버에서 관리한다.

🔨 1. 세션과 쿠키의 차이점

설명접송 상태 저장 경로장점단점
Cookie쿠키는 그저 http의 stateless(무상태성)한 것을 보완해주는 도구클라이언트서버에 부담을 덜어줌쿠키 그 자체는 인증이 아니다.
Session접속상태를 서버가 가짐(stateful)
접속 상태와 권한을 부여하기 위해 세션아이디를 쿠키로 전송서버신뢰할 수 있는 유저인지 서버에서 추가로 확인 가능하다.하나의 서버에서만 접속 상태를 가지므로 분산에 불리하다.

02. 세션 기반 인증(Session-based Authentication)


🔨 1. 로그인

1️⃣ 사용자가 웹 사이트에서 아이디와 비밀번호로 로그인을 시도했을 때

  • 사용자가 정확한 아이디와 비밀번호를 입력했다면 → 서버는 인증(Authentication)에 성공했다고 판단한다.
  • 그럼 서버가 “해당 유저는 인증에 성공했다” 라는 사실을 알고 있어 → 유저는 다음 작업을 할 때(ex. 장바구니에 물품 추가) 매번 로그인할 필요가 없다.

즉 인증에 따라 리소스의 접근 권한(Authorization)이 달라진다.

💡 그리고 서버와 클라이언트는 다음의 상태를 가지고 있어야 한다.
  • 서버 : 사용자가 인증에 성공했음을 알고 있다.
  • 클라이언트 : 인증 성공을 증명할 수단을 갖고 있다.

⇒ 이처럼 사용자가 인증의 성공한 상태를 세션이라고 한다.


2️⃣ 서버는 일종의 저장소에 세션을 저장한다.

  • 주로 in-memory(like 자바스크립트 객체), 또는 세션(redis와 같은 트랙잭션이 빠른 DB)

3️⃣ 세션이 만들어지면 → 각 세션을 구분할 수 있는 고유성을 가진 세션 아이디가 만들어지고

4️⃣ 이 세션 아이디를 세션 성공을 증명할 수단으로써 클라이언트에게 전달한다.

⇒ 이때 웹 사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용하고, 쿠키는 서버에서 발급한 세션 아이디를 저장한다.

5️⃣ 쿠키를 통해 유효한 세션아이디가 서버에 전달되고

6️⃣ 세션 스토어에 해당 세션이 존재한다면

7️⃣, 8️⃣ 서버는 해당 요청이 접근 가능하다고 판단한다.

⚠️  하지만 쿠키에 세션 아이디 정보가 없다면 → 서버는 해당 요청이 인증되지 않았음을 알려준다.

🔨 2. 로그아웃

  1. 서버 : 세션 정보를 삭제한다.
  • 서버는 클라리언트의 쿠키를 임의로 삭제할 수 없다. → 대신 set-cookie로 클라이언트에게 쿠키를 전송할 때 세션 아이디의 키값을 무효한 값으로 갱신할 수 있다.
  1. 클라이언트 : 쿠키를 갱신한다.
⛔ 주의할 점
  • 쿠키는 세셔 아이디, 즉 인증 성공에 대한 증명을 갖고 있으므로 → 탈취될 경우 서버는 해당 요청이 인증된 사용자의 요청이라고 판단한다.
  • 따라서 공공 PC 등을 사용할 땐 반드시 로그아웃해야 한다.

🔨 3. express-session

  • Node.js에는 이런 세션을 대신 관리해주는 express-session 모듈이 있다.

express-session

  • 세션을 위한 미들웨어로, express서버에서 쉽게 세션을 위한 공간을 다룰 수 있게 해준다.
const express = require('express');
const session = require('express-session');

const app = express();

app.use(
  session({
    secret: '@codestates',
    resave: false,
    saveUninitialized: true,
    cookie: {
      domain: 'localhost',
      path: '/',
      maxAge: 24 * 6 * 60 * 10000,
      sameSite: 'none',
      httpOnly: false,
      secure: true,
    },
  })
);

secret: '@codestates' : 세션은 secret옵션의 비밀키를 이용해 암호화하여 세션 id를 생성한다 → 그리고 이것을 클라이언트에게 쿠키로 전송한다.

  • 쿠키로 전송된 세션 id는 이에 종속되는 고유한 세션 객체를 가지며 이는 서버에 저장된다.

  • 이때 세션 객체는 유저별로 독립적으로 생성된 객체이므로 → 유저별로 각각 다른 데이터를 저장할 수 있다.

    → 따라서 클라이언트에 유저 개인정보를 담지 않고도 서버가 클라이언트의 세션 id를 이용해 유저의 인증여부를 판단할 수 있다.

  • 세션 객체는 req.session 을 통해 접근할 수 있으며 → 세션에 임의의 데이터를 저장하거나 불러올 수 있다.

profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글