Why CSRF still matters in React apps
Even with SPAs, state-changing requests (POST/PUT/DELETE) can be forged if your session cookie is sent automatically. Use an explicit CSRF defense so the browser must prove intent.
Core strategy (TL;DR)
- Issue a per-session (or per-request) CSRF token from your API.
- Store it in an HttpOnly cookie or expose via a safe bootstrap endpoint.
- Frontend must send the token in a custom header (e.g.,
X-CSRF-Token
). - Backend validates header token === server copy (or double-submit cookie).
- Harden cookies with
SameSite
,Secure
,HttpOnly
.
Backend: minimal Express CSRF token endpoint
// server/csrf.js import express from "express"; import crypto from "crypto"; const app = express(); app.use(express.json()); // naive in-memory store; replace with signed JWT or DB per user/session const tokens = new Map(); app.get("/csrf-token", (req, res) => { const sid = (req.headers["x-session-id"] || crypto.randomUUID()); const token = crypto.randomBytes(32).toString("hex"); tokens.set(sid, token); // set session + double-submit cookie res.setHeader("Set-Cookie", `sid=${sid}; Path=/; HttpOnly; Secure; SameSite=Strict`); res.json({ token }); }); app.post("/transfer", (req, res) => { const sid = (req.headers["x-session-id"]); const headerToken = req.headers["x-csrf-token"]; if (!sid || tokens.get(sid) !== headerToken) return res.status(403).json({error:"CSRF"}); res.json({ ok: true }); }); app.listen(3000);
Harden your cookies:
Set-Cookie: session=...; Path=/; HttpOnly; Secure; SameSite=Strict
React: fetch token once, attach to every request
// src/csrfClient.js export async function getCsrf() { const r = await fetch("/csrf-token", { credentials: "include" }); const { token } = await r.json(); // read sid from cookie for demonstration const sid = document.cookie.split("; ").find(c=>c.startsWith("sid="))?.split("=")[1]; return { token, sid }; }
// src/api.js let CSRF = { token: null, sid: null }; export async function initApi() { CSRF = await getCsrf(); } export async function apiPost(url, body) { return fetch(url, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json", "X-CSRF-Token": CSRF.token, "X-Session-Id": CSRF.sid }, body: JSON.stringify(body) }); }
📸 Screenshot of the Website Vulnerability Scanner page
Screenshot of the free tools webpage where you can access security assessment tools.
Axios interceptor alternative
// src/axiosClient.js import axios from "axios"; import { getCsrf } from "./csrfClient"; const api = axios.create({ withCredentials: true }); let csrf = null; api.interceptors.request.use(async (config) => { if (!csrf) csrf = await getCsrf(); config.headers["X-CSRF-Token"] = csrf.token; config.headers["X-Session-Id"] = csrf.sid; return config; }); export default api;
Double-submit cookie check (no server store)
// server/doubleSubmit.js import crypto from "crypto"; import cookie from "cookie"; export function issueToken(res) { const t = crypto.randomBytes(32).toString("hex"); res.setHeader("Set-Cookie", [ `csrf=${t}; Path=/; Secure; SameSite=Strict`, ]); return t; } export function validate(req) { const cookies = cookie.parse(req.headers.cookie || ""); const headerT = req.headers["x-csrf-token"]; return cookies.csrf && headerT && cookies.csrf === headerT; }
📸 Sample Vulnerability Assessment Report generated by the free tool to check Website Vulnerability
Sample vulnerability assessment report generated with our free tool, providing insights into possible vulnerabilities.
Extra hardening checklist
- Enforce
SameSite=Strict
(orLax
if you must support normal GET navigations). - Require CSRF header on state-changing routes only.
- Rotate tokens periodically; bind tokens to user/session.
- Block JSONP/CORS abuse; use strict CORS allowlists.
- Prefer
HttpOnly
+ server-side verify (or signed JWT tokens).
Keep learning & scanning
Explore more articles on our blog: https://www.pentesttesting.com/blog/
Run a free scan now: https://free.pentesttesting.com/
Managed IT Services (New)
Strengthen uptime, patching, and monitoring with our managed stack.
https://www.pentesttesting.com/managed-it-services/
AI Application Cybersecurity (New)
Secure LLM prompts, model endpoints, and AI data flows end-to-end.
https://www.pentesttesting.com/ai-application-cybersecurity/
Offer Cybersecurity to Your Clients (New)
Agencies/MSPs: white-label our testing & reporting.
https://www.pentesttesting.com/offer-cybersecurity-service-to-your-client/
Newsletter
Subscribe on LinkedIn https://www.linkedin.com/build-relation/newsletter-follow?entityUrn=7327563980778995713
Top comments (0)