express-validator

ํ•˜์ฃผ์˜ยท2024๋…„ 4์›” 29์ผ

node.js

๋ชฉ๋ก ๋ณด๊ธฐ
8/15

๐Ÿ’ก express-validator๋Š” 'validator.js'์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์™€ ์ •์ œ๊ธฐ๋ฅผ ๊ฐ์‹ธ๋Š” Express.js ๋ฏธ๋“ค์›จ์–ด ์ด๋‹ค.

  • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (validator)
  • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํ˜•์‹์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ (sanitizer) (์˜ˆ์‹œ)๋ฌธ์ž => ์ˆซ์ž ๋ณ€ํ™˜

์„ค์น˜ํ•˜๊ธฐ

npm install express-validator

์ž…๋ ฅ ๊ฒ€์‚ฌ ํ•„๋“œ

  • req.body
  • req.cookies
  • req.headers
  • req.query
  • req.params

์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

import express from 'express'
import { query, validationResult } from 'express-validator';

app.get('/', query('person').notEmpty(), (req, res) => {
  const err = validationResult(req);
  if (err.isEmpty()) {
	  // ์„ฑ๊ณต ์‹œ ๋กœ์ง 
    return res.send(`Hello, ${req.query.person}!`);
  }

	// ์‹คํŒจ ์‹œ ๋กœ์ง
   res.send({ errors: err.array() });
});
  • errors ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ๋‹ด๊ธด๋‹ค.
{
  "errors": [
    {
      "type": "field",
      "msg": "Invalid value",
      "path": "person",
      "location": "query"
    }
  ]
}

์ธ์ž๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๋•Œ?

๋ฐฐ์—ด๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
์ถ”๊ฐ€์ ์œผ๋กœ msg๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

[
      body("userId")
        .notEmpty().withMessage("์š”์ฒญ๊ฐ’์„ ์ œ๋Œ€๋กœ ๋ณด๋‚ด์ฃผ์„ธ์š”")
        .isInt().withMessage("์ˆซ์ž๋ฅผ ๋ณด๋‚ด์ฃผ์„ธ์š”"),
      body("title")
      .notEmpty()
      .isString().withMessage("๋ฌธ์ž๋ฅผ ๋ณด๋‚ด์ฃผ์„ธ์š”"),
]

์ฃผ์˜์‚ฌํ•ญ

์ž…๋ ฅ๊ฐ’์— HTML๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
์ด๊ฒƒ์„ XSS ์ทจ์•ฝ์  ๊ณต๊ฒฉ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ http://localhost:3000/hello?person=<b>John</b>์œผ๋กœ ์ด๋™ํ•˜๋ฉด "Hello, John!" ์ด๋ผ๊ณ  ์ถœ๋ ฅ์ด ๋œ๋‹ค.
๋งŒ์•ฝ ํ•ด์ปค๊ฐ€ John์„ ์‚ฝ์ž…ํ•˜๋Š” ๋Œ€์‹  ์‹ค์ œ ์•…์„ฑ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ๋ณด์•ˆ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” escape() ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

  • escape()๋Š” HTML ๋ฌธ์ž๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ •์ œ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
import express from 'express'
import { query, validationResult } from 'express-validator';

app.get('/', query('person').notEmpty().escape(), (req, res) => {
  const err = validationResult(req);
  if (err.isEmpty()) {
	  // ์„ฑ๊ณต ์‹œ ๋กœ์ง 
    return res.send(`Hello, ${req.query.person}!`);
  }

	// ์‹คํŒจ ์‹œ ๋กœ์ง
   res.send({ errors: err.array() });
});

๋ณ€๊ฒฝ ํ›„ Hello, <b>John</b>! ์ด ํ‘œ์‹œ๋œ๋‹ค.

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด ๋ถ„๋ฆฌํ•˜๊ธฐ

// ๋ฏธ๋“ค์›จ์–ด
const validate = (req, res, next) => {
  const err = validationResult(req);

  if (!err.isEmpty()) {
    return res.send({ errors: err.array() });
  }

  // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ํ†ต๊ณผํ–ˆ์„ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ œ์–ด๋ฅผ ๋„˜๊น€
  return next();
};

app.get('/', [query('person').notEmpty().escape(), validate], (req, res) => {
  console.log(req.query);
  return res.send(`Hello, ${req.query.person}!`);
});

์ฐธ๊ณ ๋ฌธ์„œ
https://express-validator.github.io/docs/guides/getting-started

0๊ฐœ์˜ ๋Œ“๊ธ€