NodeJS๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ๋ฐฑ์๋ ํ๊ฒฝ์ด๋ค. ๊ทธ๋งํผ ๋ณด์ ์ด์๋ ๋ง๊ณ ๋ณด์ ๊ด๋ จ ํ๋ ์์ํฌ๋ ๋ค์ํ๋ค. ์ด ํฌ์คํธ์์๋ NodeJS์ ๋ณด์์ ํฅ์ํ ์ ์๋ ๊ธฐ์ด์ ์ธ ๋ฐฉ๋ฒ์ ์๊ฐํ ์์ ์ด๋ค.
1. NPM audit
npm ๋ชจ๋์ ๋ณด์ ์ทจ์ฝ์ ์ ์๋์ผ๋ก ์ง๋จํด์ฃผ๊ณ ๋ชจ๋์ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์์ ์์ฒญํ๋ฉด ๋๋ค.
npm audit
2. ngnix ์ฌ์ฉ
nodejs๋ฅผ 80, 443ํฌํธ๋ก ๋ฐ๋ก ๋ ธ์ถ์ํค๋ฉด ์ฌ๋ฌ ๋ณด์ ์ด์์ ์ง๋ฉดํ ์ ์๋ค. ํฌํธ๋ 3000์ผ๋ก ํด๋๊ณ ngnix proxy ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๋ค์ ์จ๊ฒจ์ฃผ์. ๋ํ letsencrypt๋ฅผ ์ฌ์ฉํด์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ๊ธฐ์๋ ์์ํด์ง๋ค.
3. Helmet ๋ณด์ ๋ชจ๋ ์ ์ฉ
express ํ๋ ์์ํฌ ์ฌ์ฉ์ ํค๋ ์ค์ ์ผ๋ก ์๋ ค์ง ๋ณด์ ์ด์๋ก๋ถํฐ ์๋ฒ๋ฅผ ๋ณดํธํ๋ ๋ชจ๋์ด๋ค. ์ฌ์ค์ ๊ธฐ์ด์ ์ธ ๊ณต๊ฒฉ ์ ๋๋ ๋ฌด๋ํ๊ฒ ๋ฐฉ์ดํ ์ ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
npm install helmet
import express from 'express';
import helmet from "helmet";
const app = express();
app.use(helmet());
https://www.npmjs.com/package/helmet
4. ๋ฌด์ค๋จ
์๋ฒ์ ๋ฒ๊ทธ๋ ํดํน์ผ๋ก ์ธํด ์๋ฒ๊ฐ ์ค๋จ๋๋ ์ํฉ์ ๋ง์์ผ๋ง ํ๋ค.
npm install forever
forever start app.js
5. ์ ์ ํ์ผ์ CDN์ด๋ reverse proxy๋ก ์ ๊ณต
nodejs๋ ๋จ์ผ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ ๊ธฐ์ ํ ๋ฒ์ ๋ง์ ์ฉ๋์ ์คํธ๋ฆผ ํ๋ ๋ฐ์๋ ํ๊ณ๊ฐ ์๋ค. ๋ฐ๋ผ์ ngnix reverse proxy์ ์ ์ ํ์ผ์ ์ฐ๊ฒฐํ๊ฑฐ๋ ์คํ์์ค ์ฝ๋์ ๊ฒฝ์ฐ cdn์ ์ฌ์ฉํด์ผ ํ๋ค.
6. ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฆํ๊ธฐ
๋๋ถ๋ถ์ XSS๊ณต๊ฒฉ๊ณผ ์ทจ์ฝ์ ์ ์๋ฒ๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๋จ๊ณ์์ ์์ํ๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ์ฒ๋ฆฌํ๊ณ ๊ฒ์ฆํ๋ ๊ณผ์ ์ด ์๋ฒ ๋ณด์์ ํต์ฌ์ด๋ค. (์ฌ์ฉ์์ ์ ๋ ฅ์ ์ ๋ ์ ๋ขฐํด์๋ ์๋๋ค)
npm install validator
import validator from 'validator';
validator.isEmail('foo@bar.com');
https://github.com/validatorjs/validator.js
7. 4XX, 5XX ์ปค์คํ ์๋ฌ ํ์ด์ง ํ์
nodejs ํ๊ฒฝ์์ ํ์๋๋ ์๋ฌ ๋ฉ์์ง๋ ๊ณต๊ฒฉ์์๊ฒ ์์ฃผ ์ข์ ์ ๋ณด๊ฐ ๋ ์ ์๋ค. ๋ฐ๋ผ์ ์๋ฌ๋ฅผ ์ ํธ๋ค๋งํด์ฃผ๋ ๊ฒ ์ค์ํ๋ค.
router.get('*', function(req, res){
res.status(404).render('page/error/404')
});
์ฐธ๊ณ ์๋ฃ
https://expressjs.com/ko/advanced/best-practice-security.html#use-cookies-securely
https://letsencrypt.org/about/
https://blog.ull.im/engineering/2019/03/31/node-js-production-best-practices.html
https://auto1.tech/securing-nodejs-applications/
'๐ป๊ธฐ์ > Security' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ฐ์ธ์ ๋ณด ์ ๊ณต์ ๋์ํ์ญ๋๊น (0) | 2022.11.13 |
---|