[BACKEND]Session
Session
서버가 클라이언트에 유일하고 암호화된 ID 저장
중요 데이터는 서버에서 관리
Cookie vs Session
-
Cookie
- 역할 - http의 stateless를 보완
- 접속 상태 저장 경로 - 클라이언트
- 장점 - 서버 부담 감소
- 단점 - 쿠키 자체는 인증이 아님
- 유효기간이 없거나 유저가 삭제하지 않는한 영원하기 때문에 인증 정보를 담기에 부적합
-
Session
- 역할 - 접속 상태를 서버가 가짐(stateful) / 접속 상태와 권한 부여를 위해 세션아이디를 쿠키로 보냄
- 접속 상태 저장 경로 - 서버
- 장점 - 신뢰할 수 있는 유저인지 서버에서 추가 확인 가능
- 단점 - 하나의 서버에서만 접속 상태를 가져 분산 불리, 사용자가 많다면 서버 성능 저하, 쿠키 탈취 가능성 유지
- 인증 정보를 저장하지 않고 클라이언트마다 하나밖에 없는 아이디를 쿠키에 담아 클라이언트에 전송
- 중복로그인, 해외로그인 방지 가능
- 토큰으로 분산 분리를 보완
세션기반 인증
로그인
로그인 - 서버는 인증(Authentication)에 성공을 알림
장바구니 - 서버는 클라이언트가 인증됨을 확인
인증에 따라 리소스의 접근 권한(Authorization)이 달라짐
- 서버 - 사용자가 인증에 성공했음 인지
-
클라이언트 - 인증 성공을 증명할 수단 보유
- 세션 - 사용자가 인증에 성공한 상태
- 서버는 일종의 저장소에 세션 저장. (2번)주로 in-memory(자바스크립트 객체), 또는 세션 스토어(redis 등과 같은 트랜잭션이 빠른 DB)에 저장.
- 세션 생성 시 세션 아이디도 생성 (3번), 보통 클라이언트에 세션 성공을 증명할 수단으로써 세션 아이디 전달(4번)
- 웹사이트에서 로그인 유지를 위한 수단으로 쿠키 사용, 쿠키에 세션 아이디 저장
쿠키를 통해 유효한 세션 아이디 서버에 전달(5번), 세션 스토어에 해당 세션이 존재한다면(6번) 서버는 해당 요청 접근 가능 판단. (7,8번)
로그아웃
- 서버 - 세션 정보 삭제
- 클라이언트 - 쿠키 갱신
서버는 클라이언트의 쿠키 임의 삭제 불가
set-cookie로 클라이언트에게 쿠키 전송 시 세션 아이디의 키값을 무효한 값으로 갱신
express-session
Node.js에서 세션을 대신 관리하는 모듈
세션을 위한 미들웨어, 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 옵션의 비밀키를 이용해 암호화해 세션 id라는 것을 생성 -> 클라이언트에게 쿠키로 전송 -> 쿠키로 전송된 세션 id는 이에 종속되는 고유한 세션 객체를 가지며 이는 서버에 저장, 세션 객체는 유저별로 독립적으로 생성된 객체이므로 유저별로 각각 다른 데이터를 저장, 클라이언트에 유저의 개인정보를 담지않고도 서버가 클라이언트의 세션 id를 이용해 유저의 인증여부를 판단
세션 객체는 req.session으로 접근, 세션에 임의의 데이터를 저장하거나 불러옴
https://github.com/expressjs/session#reqsession
댓글남기기