사용자 인증 기초 (쿠키와 세션)
HTTP는 본래 "기억력"이 없어서(Stateless), 방금 로그인한 유저도 새로고침하면 누구인지 까먹습니다. 이를 해결하기 위해 서버(세션)에 방문자 명부를 적어두고, 브라우저에게 입장권(쿠키)을 쥐여주는 것이 전통적인 인증 방식입니다.
💡 핵심 비유: 놀이공원 입장권
- 세션(Session): 놀이공원 매표소의 장부 (누가 입장권을 샀는지 서버가 기억함)
- 쿠키(Cookie): 손님(브라우저)의 손목에 채워주는 자유이용권 팔찌 (요청할 때마다 서버에 보여줌)
🍪 쿠키와 세션의 동작 흐름
📊 쿠키 vs 세션 비교
| 구분 |
쿠키 (Cookie) |
세션 (Session) |
| 저장 위치 |
클라이언트 (브라우저) |
서버 (메모리 또는 DB) |
| 보안성 |
취약함 (탈취 및 변조 가능) |
비교적 우수함 (데이터는 서버에 있음) |
| 속도 / 부하 |
빠름 / 서버 부하 적음 |
조금 느림 / 사용자 많을시 서버 부하 큼 |
쿠키와 세션 인증 시뮬레이션
서버가 어떻게 세션을 발급하여 기억하고, 브라우저가 어떻게 쿠키를 매번 제출하여 자신이 누구인지 증명하는지 확인해 보세요.
const express = require('express');
const app = express();
// 가상의 서버 메모리 세션 저장소 (보통 DB나 Redis 사용)
const sessionDB = {};
app.post('/login', (req, res) => {
const { id, pw } = req.body;
if (id === 'admin' && pw === '1234') {
// 1. 유니크한 세션 ID(입장권 번호) 생성
const sessionId = 'xyz_' + Math.random().toString(36).substr(2, 9);
// 2. 서버의 장부(Session)에 유저 정보 기록
sessionDB[sessionId] = { userId: id, role: 'admin' };
// 3. 브라우저에게 쿠키(Cookie) 발급 및 응답
res.cookie('session_id', sessionId, { httpOnly: true });
return res.json({ success: true, message: '로그인 성공' });
}
res.status(401).json({ success: false, message: '인증 실패' });
});
app.get('/profile', (req, res) => {
// 클라이언트가 보낸 쿠키에서 세션 ID 확인
const sessionId = req.cookies.session_id;
const user = sessionDB[sessionId];
if (user) {
res.json({ authorized: true, user });
} else {
res.status(401).json({ authorized: false, message: '세션 만료됨' });
}
});
🔒 쿠키와 세션 시뮬레이터
👤
환영합니다!
Server Console
$ node auth.js
서버 실행 중...