authn_z
This commit is contained in:
@@ -0,0 +1,280 @@
|
||||
\section{Session}
|
||||
|
||||
\begin{frame}{Mi az a session?}
|
||||
\begin{block}{Definíció}
|
||||
Szerver-oldali állapot, amely felhasználói adatokat tárol bejelentkezés után.
|
||||
\end{block}
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Stateful} megközelítés
|
||||
\item Kliens csak \textbf{session ID}-t tárol (cookie)
|
||||
\item Tartalom a szerveren (memória/DB/Redis)
|
||||
\end{itemize}
|
||||
|
||||
\begin{alertblock}{Fontos}
|
||||
Session auth nem token-alapú, szerver kezeli az állapotot.
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Session vs Token}
|
||||
\begin{columns}
|
||||
\begin{column}{0.48\textwidth}
|
||||
\begin{block}{Session}
|
||||
\begin{itemize}
|
||||
\item Szerver tárolja
|
||||
\item Cookie-ban ID
|
||||
\item Könnyű visszavonás
|
||||
\item Nehezebb skálázás
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{column}
|
||||
|
||||
\begin{column}{0.48\textwidth}
|
||||
\begin{block}{Token (JWT)}
|
||||
\begin{itemize}
|
||||
\item Stateless
|
||||
\item Kliens tárolja
|
||||
\item Nehezebb visszavonás
|
||||
\item Könnyebb skálázás
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
|
||||
\begin{center}
|
||||
Session $\leftrightarrow$ JWT: kontroll vs skálázhatóság
|
||||
\end{center}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Session folyamat}
|
||||
\begin{enumerate}
|
||||
\item Bejelentkezés (username + password)
|
||||
\item Adatok ellenőrzése
|
||||
\item \textbf{Session} létrehozás
|
||||
\item Session ID cookie-ban
|
||||
\item Kliens csatolja minden kéréshez
|
||||
\item Szerver ID alapján azonosít
|
||||
\end{enumerate}
|
||||
|
||||
\begin{alertblock}{Megjegyzés}
|
||||
HTTPS kötelező, különben session ID elliopható!
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Session tárolás}
|
||||
\begin{block}{Hol tároljuk?}
|
||||
Session adatokat szerveren, több lehetőség:
|
||||
\end{block}
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{In-memory} - gyors, nem skálázható
|
||||
\item \textbf{Redis} - gyors, skálázható, TTL
|
||||
\item \textbf{DB} - tartós, lassabb
|
||||
\item \textbf{Distributed cache} - nagy rendszerekhez
|
||||
\end{itemize}
|
||||
|
||||
\begin{alertblock}{Best Practice}
|
||||
Élesben ne használj in-memory store-t!
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile,shrink=15]{Redis Session Store - Telepítés}
|
||||
\begin{block}{Redis előnyei session tároláshoz}
|
||||
Gyors, skálázható, beépített TTL (Time To Live) támogatás
|
||||
\end{block}
|
||||
|
||||
\begin{verbatim}
|
||||
npm install express-session connect-redis redis
|
||||
|
||||
// Redis kliens és session store
|
||||
const session = require('express-session');
|
||||
const RedisStore = require('connect-redis').default;
|
||||
const { createClient } = require('redis');
|
||||
|
||||
const redisClient = createClient({
|
||||
host: 'localhost',
|
||||
port: 6379
|
||||
});
|
||||
redisClient.connect();
|
||||
\end{verbatim}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile,shrink=15]{Redis Session - Konfiguráció}
|
||||
\begin{verbatim}
|
||||
app.use(session({
|
||||
store: new RedisStore({ client: redisClient }),
|
||||
secret: process.env.SESSION_SECRET,
|
||||
resave: false,
|
||||
saveUninitialized: false,
|
||||
cookie: {
|
||||
httpOnly: true,
|
||||
secure: true, // HTTPS
|
||||
maxAge: 1000 * 60 * 60 * 24 // 1 nap
|
||||
}
|
||||
}));
|
||||
|
||||
app.post('/login', async (req, res) => {
|
||||
const user = await authenticateUser(req.body);
|
||||
req.session.userId = user.id;
|
||||
req.session.role = user.role;
|
||||
res.json({ success: true });
|
||||
});
|
||||
\end{verbatim}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile,shrink=15]{Redis Session - Műveletek}
|
||||
\begin{verbatim}
|
||||
// Session olvasása
|
||||
app.get('/profile', (req, res) => {
|
||||
if (!req.session.userId) {
|
||||
return res.status(401).json({ error: 'Not logged in' });
|
||||
}
|
||||
res.json({ userId: req.session.userId });
|
||||
});
|
||||
|
||||
// Session módosítása
|
||||
app.post('/settings', (req, res) => {
|
||||
req.session.theme = req.body.theme;
|
||||
res.json({ success: true });
|
||||
});
|
||||
|
||||
// Session törlése (logout)
|
||||
app.post('/logout', (req, res) => {
|
||||
req.session.destroy((err) => {
|
||||
if (err) return res.status(500).send('Error');
|
||||
res.clearCookie('connect.sid');
|
||||
res.json({ message: 'Logged out' });
|
||||
});
|
||||
});
|
||||
\end{verbatim}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=15]{Redis Session előnyei}
|
||||
\begin{columns}
|
||||
\begin{column}{0.48\textwidth}
|
||||
\textbf{Előnyök:}
|
||||
\begin{itemize}
|
||||
\item Villámgyors (in-memory)
|
||||
\item Automatikus TTL támogatás
|
||||
\item Skálázható (cluster mode)
|
||||
\item Persistence opcionális
|
||||
\item Pub/Sub támogatás
|
||||
\end{itemize}
|
||||
\end{column}
|
||||
\begin{column}{0.48\textwidth}
|
||||
\textbf{Használati esetek:}
|
||||
\begin{itemize}
|
||||
\item Session store
|
||||
\item Rate limiting
|
||||
\item Real-time analytics
|
||||
\item Cache layer
|
||||
\item Message queue
|
||||
\end{itemize}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Session élettartam}
|
||||
\begin{block}{Session Timeout}
|
||||
Session-ök lejárnak idő vagy inaktivitás után.
|
||||
\end{block}
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Absolute:} fix lejárat (pl. 24h)
|
||||
\item \textbf{Idle:} aktivitás hiánya
|
||||
\item \textbf{Sliding:} aktivitás meghosszabbítja
|
||||
\end{itemize}
|
||||
|
||||
\begin{exampleblock}{Példa}
|
||||
Online bank: 5 perc inaktivitás $\to$ kiléptetés.
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile,shrink=10]{Express session példa}
|
||||
\begin{exampleblock}{express-session használata}
|
||||
\tiny
|
||||
\begin{verbatim}
|
||||
const session = require('express-session');
|
||||
|
||||
app.use(session({
|
||||
secret: 'super-secret-key',
|
||||
resave: false,
|
||||
saveUninitialized: false,
|
||||
cookie: {
|
||||
httpOnly: true,
|
||||
secure: true,
|
||||
maxAge: 1000 * 60 * 60 // 1 óra
|
||||
}
|
||||
}));
|
||||
|
||||
app.post('/login', (req, res) => {
|
||||
req.session.userId = user.id;
|
||||
res.json({ message: 'Logged in' });
|
||||
});
|
||||
\end{verbatim}
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Cookie biztonság}
|
||||
\begin{block}{Mitől biztonságos?}
|
||||
Session ID cookie biztonságos beállításokkal.
|
||||
\end{block}
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{HttpOnly}: JS nem fér hozzá
|
||||
\item \textbf{Secure}: csak HTTPS
|
||||
\item \textbf{SameSite}: CSRF védelem
|
||||
\item \textbf{Rotálás}: ID frissítés (fixation ellen)
|
||||
\end{itemize}
|
||||
|
||||
\begin{alertblock}{Session Fixation}
|
||||
Támadó előre beállított ID-t "ráerőltet" a felhasználóra.
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=5]{Session alapú autorizáció}
|
||||
\begin{block}{Jogosultságok session-ben}
|
||||
A session tárolhatja a felhasználó szerepköreit és jogosultságait.
|
||||
\end{block}
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Példa:} \texttt{req.session.role = 'Admin'}
|
||||
\item Middleware ellenőrzi a role-t
|
||||
\item Ha nincs jogosultság: \texttt{403 Forbidden}
|
||||
\end{itemize}
|
||||
|
||||
\vspace{0.4cm}
|
||||
|
||||
\begin{exampleblock}{Minta ellenőrzés}
|
||||
\texttt{if (req.session.role !== 'Admin') return res.status(403);}
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Session Best Practices}
|
||||
\begin{itemize}
|
||||
\item HTTPS használata mindenhol
|
||||
\item HttpOnly + Secure + SameSite cookie beállítások
|
||||
\item Session store: Redis vagy DB
|
||||
\item Rövid idle timeout érzékeny rendszereknél
|
||||
\item Session ID rotálás bejelentkezéskor
|
||||
\item Rate limiting és brute force védelem
|
||||
\end{itemize}
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Összefoglalás - Session}
|
||||
\begin{itemize}
|
||||
\item Session = szerver-oldali állapot (cookie csak ID)
|
||||
\item Kényelmes, de skálázásnál kihívás
|
||||
\item Cookie biztonsági beállítások kritikusak
|
||||
\item \textbf{Redis a leggyakoribb session store} - gyors, skálázható
|
||||
\item Timeout és rotáció védelem session támadások ellen
|
||||
\item Redis TTL automatikus session lejárathoz
|
||||
\end{itemize}
|
||||
|
||||
\begin{exampleblock}{Produkciós környezet}
|
||||
Redis cluster + persistence + backup = megbízható session kezelés
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
Reference in New Issue
Block a user