: 서버가 클라이이언트에 암호화된 ID를 부여하는 방식으로, 중요 데이터는 서버에서 관리한다.
설명 | 접송 상태 저장 경로 | 장점 | 단점 | |
---|---|---|---|---|
Cookie | 쿠키는 그저 http의 stateless(무상태성)한 것을 보완해주는 도구 | 클라이언트 | 서버에 부담을 덜어줌 | 쿠키 그 자체는 인증이 아니다. |
Session | 접속상태를 서버가 가짐(stateful) | |||
접속 상태와 권한을 부여하기 위해 세션아이디를 쿠키로 전송 | 서버 | 신뢰할 수 있는 유저인지 서버에서 추가로 확인 가능하다. | 하나의 서버에서만 접속 상태를 가지므로 분산에 불리하다. |
1️⃣ 사용자가 웹 사이트에서 아이디와 비밀번호로 로그인을 시도했을 때
💡 그리고 서버와 클라이언트는 다음의 상태를 가지고 있어야 한다.즉 인증에 따라 리소스의 접근 권한(Authorization)이 달라진다.
2️⃣ 서버는 일종의 저장소에 세션을 저장한다.
3️⃣ 세션이 만들어지면 → 각 세션을 구분할 수 있는 고유성을 가진 세션 아이디가 만들어지고
4️⃣ 이 세션 아이디를 세션 성공을 증명할 수단으로써 클라이언트에게 전달한다.
⇒ 이때 웹 사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용하고, 쿠키는 서버에서 발급한 세션 아이디를 저장한다.
5️⃣ 쿠키를 통해 유효한 세션아이디가 서버에 전달되고
6️⃣ 세션 스토어에 해당 세션이 존재한다면
7️⃣, 8️⃣ 서버는 해당 요청이 접근 가능하다고 판단한다.
set-cookie
로 클라이언트에게 쿠키를 전송할 때 세션 아이디의 키값을 무효한 값으로 갱신할 수 있다.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
을 통해 접근할 수 있으며 → 세션에 임의의 데이터를 저장하거나 불러올 수 있다.