Skip to content

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;
}

Released under the MIT License