Authentication Sessions
Session คือช่วงเวลาที่ผู้ใช้เข้าสู่ระบบและมีการเก็บข้อมูลการยืนยันตัวตนไว้ชั่วคราว เพื่อไม่ต้อง login ใหม่ทุกครั้ง
1. Server-side Sessions
เก็บข้อมูล session ไว้ที่ server โดยส่ง session ID ให้ client เก็บไว้
javascript
// Express.js session example
import express from 'express';
import session from 'express-session';
const app = express();
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: {
secure: true,
maxAge: 24 * 60 * 60 * 1000 // 1 day
}
}));
app.post('/login', (req, res) => {
// After authentication
req.session.userId = user.id;
req.session.isLoggedIn = true;
});
2. Client-side Sessions
เก็บข้อมูล session ไว้ที่ client (browser) เช่นใน localStorage หรือ cookie
javascript
// Client-side session management
class SessionManager {
static setSession(userData) {
localStorage.setItem('user', JSON.stringify(userData));
localStorage.setItem('lastActivity', Date.now());
}
static getSession() {
const user = localStorage.getItem('user');
const lastActivity = localStorage.getItem('lastActivity');
if (!user || this.isSessionExpired(lastActivity)) {
this.clearSession();
return null;
}
return JSON.parse(user);
}
static isSessionExpired(lastActivity) {
const SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes
return Date.now() - lastActivity > SESSION_TIMEOUT;
}
static clearSession() {
localStorage.removeItem('user');
localStorage.removeItem('lastActivity');
}
}
3. Distributed Sessions
การจัดการ session ในระบบที่มีหลาย server โดยใช้ shared storage เช่น Redis
javascript
// Redis session store example
import Redis from 'ioredis';
import connectRedis from 'connect-redis';
const RedisStore = connectRedis(session);
const redis = new Redis({
host: 'localhost',
port: 6379
});
app.use(session({
store: new RedisStore({ client: redis }),
secret: 'your-secret-key',
resave: false,
saveUninitialized: false
}));
4. Session Security
การรักษาความปลอดภัยของ session
javascript
// Security middleware example
function sessionSecurity(req, res, next) {
// Regenerate session ID periodically
if (shouldRegenerateSession(req)) {
req.session.regenerate((err) => {
if (err) next(err);
next();
});
return;
}
// Check for session hijacking
if (isSessionHijacked(req)) {
req.session.destroy();
return res.status(401).send('Session invalid');
}
next();
}
function shouldRegenerateSession(req) {
const SESSION_REGEN_INTERVAL = 15 * 60 * 1000; // 15 minutes
return Date.now() - req.session.lastRegenerate > SESSION_REGEN_INTERVAL;
}