교차 사이트 요청 위조(CSRF) - 보호 미들웨어 누락
Cross-Site Request Forgery (CSRF)
Last updated
Cross-Site Request Forgery (CSRF)
Last updated
const express = require("express");
const session = require("express-session");
const app = express();
app.use(express.urlencoded({ extended: false }));
app.use(
session({ secret: "secret!", resave: false, saveUninitialized: false })
);
// 취약: 세션을 쓰지만 CSRF 보호 미들웨어 없음
app.post("/account/email", (req, res) => {
const userId = req.session.userId;
const newEmail = req.body.email;
// ... DB에 이메일 업데이트 수행
res.send("updated");
});
app.listen(3000);const express = require("express");
const session = require("express-session");
const csurf = require("csurf");
const app = express();
app.use(express.urlencoded({ extended: false }));
app.use(
session({ secret: "secret!", resave: false, saveUninitialized: false })
);
// 전역 적용: 모든 상태 변경 라우트에 CSRF 토큰 검증이 수행됨
app.use(csurf());
// 폼 페이지에서 CSRF 토큰을 전달(템플릿/프론트로 전달하여 hidden 필드나 헤더로 보냄)
app.get("/account/email", (req, res) => {
res.json({ csrfToken: req.csrfToken() });
});
// 안전: 토큰이 없는 요청은 거부됨
app.post("/account/email", (req, res) => {
const userId = req.session.userId;
const newEmail = req.body.email;
// ... DB 업데이트
res.send("updated");
});
app.listen(3000);