167 lines
5.0 KiB
TeX
167 lines
5.0 KiB
TeX
\section{HTTP Cookies}
|
|
|
|
\begin{frame}[shrink=15]{Mi az a Cookie?}
|
|
\begin{block}{HTTP Cookie definíció}
|
|
Kis méretű adat (max 4KB), amit szerver küld böngészőnek, automatikusan visszaküldődik.
|
|
\end{block}
|
|
\begin{itemize}
|
|
\item Session kezelés, preferenciák, tracking
|
|
\item Beállítható élettartam
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile,shrink=15]{Cookie beállítása Express-ben}
|
|
\begin{verbatim}
|
|
// Egyszerű cookie
|
|
res.cookie('session', 'abc123');
|
|
|
|
// Opciókkal
|
|
res.cookie('user', 'john', {
|
|
maxAge: 900000, // 15 perc ms-ban
|
|
httpOnly: true, // JS nem fér hozzá
|
|
secure: true, // csak HTTPS
|
|
sameSite: 'strict' // CSRF védelem
|
|
});
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[shrink=15]{Cookie attribútumok}
|
|
\begin{small}
|
|
\begin{itemize}
|
|
\item \textbf{Domain}: \texttt{.example.com} - subdomain-ek
|
|
\item \textbf{Path}: \texttt{/api} - URL path scope
|
|
\item \textbf{Expires/Max-Age}: Lejárat ideje
|
|
\item \textbf{HttpOnly}: JS hozzáférés blokkolása (XSS védelem)
|
|
\item \textbf{Secure}: Csak HTTPS-en küldve
|
|
\item \textbf{SameSite}: \texttt{Strict|Lax|None} - CSRF védelem
|
|
\end{itemize}
|
|
\end{small}
|
|
\end{frame}
|
|
|
|
\begin{frame}[shrink=15]{Cookie típusok}
|
|
\begin{enumerate}
|
|
\item \textbf{Session Cookie}: Nincs Expires/Max-Age, böngésző bezáráskor törlődik
|
|
\item \textbf{Persistent Cookie}: Van lejárati idő, túléli böngésző bezárást
|
|
\item \textbf{Secure Cookie}: Csak HTTPS-en
|
|
\item \textbf{HttpOnly Cookie}: JS nem fér hozzá
|
|
\item \textbf{SameSite Cookie}: CSRF támadás ellen
|
|
\item \textbf{Third-party Cookie}: Más domain-ről
|
|
\end{enumerate}
|
|
\end{frame}
|
|
|
|
\begin{frame}[shrink=15]{SameSite Cookie attribútum}
|
|
\begin{description}
|
|
\item[Strict] Cookie csak saját site kérésekkel küldve. Legjobb CSRF védelem.
|
|
\item[Lax] GET kéréseknél küldi cross-site. Default modern böngészőkben.
|
|
\item[None] Mindig küldi (Secure kötelező). Third-party használathoz.
|
|
\end{description}
|
|
\begin{alertblock}{CSRF véd}
|
|
SameSite=Strict/Lax megakadályozza cross-site támadásokat.
|
|
\end{alertblock}
|
|
\end{frame}
|
|
|
|
\begin{frame}[shrink=15]{Cookie vs localStorage vs sessionStorage}
|
|
\begin{tiny}
|
|
\begin{tabular}{|l|c|c|c|}
|
|
\hline
|
|
& \textbf{Cookie} & \textbf{localStorage} & \textbf{sessionStorage} \\
|
|
\hline
|
|
Kapacitás & 4KB & 5-10MB & 5-10MB \\
|
|
Lejárat & Beállítható & Nincs & Tab bezárás \\
|
|
HTTP-ben & Igen & Nem & Nem \\
|
|
XSS véd & HttpOnly & Nem & Nem \\
|
|
\hline
|
|
\end{tabular}
|
|
\end{tiny}
|
|
\begin{exampleblock}{Ajánlás}
|
|
\textbf{Érzékeny:} HttpOnly Cookie, \textbf{Publikus:} localStorage
|
|
\end{exampleblock}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile,shrink=15]{Cookie olvasása Express-ben}
|
|
\begin{verbatim}
|
|
const cookieParser = require('cookie-parser');
|
|
app.use(cookieParser());
|
|
|
|
app.get('/profile', (req, res) => {
|
|
const sessionId = req.cookies.session;
|
|
res.json({ sessionId });
|
|
});
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile,shrink=15]{Cookie törlése}
|
|
\begin{verbatim}
|
|
app.post('/logout', (req, res) => {
|
|
res.clearCookie('session');
|
|
res.json({ message: 'Logged out' });
|
|
});
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile,shrink=15]{Signed Cookies}
|
|
\begin{block}{Integritás védelem}
|
|
HMAC aláírással ellátott cookie, megakadályozza manipulációt.
|
|
\end{block}
|
|
\begin{verbatim}
|
|
app.use(cookieParser('secret-key'));
|
|
|
|
app.get('/set', (req, res) => {
|
|
res.cookie('userId', '123', { signed: true });
|
|
res.send('OK');
|
|
});
|
|
|
|
app.get('/get', (req, res) => {
|
|
const id = req.signedCookies.userId;
|
|
res.json({ id });
|
|
});
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[shrink=15]{XSS vs CSRF}
|
|
\begin{columns}
|
|
\begin{column}{0.48\textwidth}
|
|
\textbf{XSS (Cross-Site Scripting)}
|
|
\begin{itemize}
|
|
\item JS injection támadás
|
|
\item Cookie lopás \texttt{document.cookie}
|
|
\item \textbf{Védelem:} HttpOnly cookie
|
|
\end{itemize}
|
|
\end{column}
|
|
\begin{column}{0.48\textwidth}
|
|
\textbf{CSRF (Cross-Site Request Forgery)}
|
|
\begin{itemize}
|
|
\item Hamis kérés küldés
|
|
\item Cookie auto-send kihasználása
|
|
\item \textbf{Védelem:} SameSite, CSRF token
|
|
\end{itemize}
|
|
\end{column}
|
|
\end{columns}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile,shrink=20]{CSRF Token védelem}
|
|
\begin{verbatim}
|
|
const csrf = require('csurf');
|
|
app.use(csrf({ cookie: true }));
|
|
|
|
app.get('/form', (req, res) => {
|
|
res.render('form', { csrfToken: req.csrfToken() });
|
|
});
|
|
|
|
app.post('/submit', (req, res) => {
|
|
res.send('Valid!');
|
|
});
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[shrink=15]{Cookie Security Best Practices}
|
|
\begin{enumerate}
|
|
\item \textbf{HttpOnly}: Érzékeny cookie-khoz mindig
|
|
\item \textbf{Secure}: Éles környezetben HTTPS-el
|
|
\item \textbf{SameSite}: Strict vagy Lax CSRF ellen
|
|
\item \textbf{Short expiration}: Session token-ekhez rövid lejárat
|
|
\item \textbf{Domain scope}: Csak szükséges domain-hez
|
|
\item \textbf{Signed cookies}: Integritás ellenőrzéshez
|
|
\end{enumerate}
|
|
\end{frame}
|