Security

Security

이 μž₯μ—μ„œλŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆλŠ” λͺ‡ κ°€μ§€ κΈ°μˆ μ„ λ°°μ›λ‹ˆλ‹€.

Helmet

Helmet은 HTTP 헀더λ₯Ό μ μ ˆν•˜κ²Œ μ„€μ •ν•˜μ—¬ 잘 μ•Œλ €μ§„ 일뢀 μ›Ή μ·¨μ•½μ μœΌλ‘œλΆ€ν„° 앱을 보호 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 Helmet은 λ³΄μ•ˆ κ΄€λ ¨ HTTP 헀더λ₯Ό μ„€μ •ν•˜λŠ” 12 개의 μž‘μ€ 미듀웨어 ν•¨μˆ˜ λͺ¨μŒμž…λ‹ˆλ‹€ (더보기). λ¨Όμ € ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜μ‹­μ‹œμ˜€.

$ npm i --save helmet

μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ κΈ€λ‘œλ²Œ λ―Έλ“€μ›¨μ–΄λ‘œ μ μš©ν•˜μ‹­μ‹œμ˜€.

import * as helmet from 'helmet';
// somewhere in your initialization file
app.use(helmet());

CORS

CORS (Cross-Origin Resource Sharing)λŠ” λ‹€λ₯Έ λ„λ©”μΈμ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  수 μžˆλŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€. ν›„λ“œ μ•„λž˜μ—μ„œ NestλŠ” cors νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 νŒ¨ν‚€μ§€λŠ” μš”κ΅¬ 사항에 따라 μ‚¬μš©μž μ§€μ •ν•  수 μžˆλŠ” μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. CORSλ₯Ό ν™œμ„±ν™”ν•˜λ €λ©΄ enableCors()λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

const app = await NestFactory.create(ApplicationModule);
app.enableCors();
await app.listen(3000);

λ˜ν•œ ꡬ성 객체λ₯Ό 이 ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜λ‘œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš© κ°€λŠ₯ν•œ 속성은 곡식 cors μ €μž₯μ†Œμ— μ² μ €ν•˜κ²Œ μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 방법은 Nest μ˜΅μ…˜ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

const app = await NestFactory.create(ApplicationModule, { cors: true });
await app.listen(3000);

쑰건 값을 μ „λ‹¬ν•˜λŠ” λŒ€μ‹  cors ꡬ성 객체λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ (μ—¬κΈ° μ°Έμ‘°).

CSRF

μ‚¬μ΄νŠΈ κ°„ μš”μ²­ μœ„μ‘° (CSRF λ˜λŠ” XSRF라고 함)λŠ” μ›Ή μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‹ λ’°ν•˜λŠ” μ‚¬μš©μžλ‘œλΆ€ν„° 무단 λͺ…령이 μ „μ†‘λ˜λŠ” μ›Ή μ‚¬μ΄νŠΈμ˜ μ•…μ˜μ μΈ μ•…μš© μœ ν˜•μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ 곡격을 μ™„ν™”ν•˜κΈ° μœ„ν•΄ csurf νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ¨Όμ € ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜μ‹­μ‹œμ˜€.

$ npm i --save csurf

μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ κΈ€λ‘œλ²Œ λ―Έλ“€μ›¨μ–΄λ‘œ μ μš©ν•˜μ‹­μ‹œμ˜€.

import * as csurf from 'csurf';
// somewhere in your initialization file
app.use(csurf());

Rate limiting

무차별 λŒ€μž… κ³΅κ²©μœΌλ‘œλΆ€ν„° μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ³΄ν˜Έν•˜λ €λ©΄ μΌμ’…μ˜ 속도 μ œν•œμ„ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. 운 μ’‹κ²Œλ„ NPMμ—λŠ” 이미 λ‹€μ–‘ν•œ 미듀웨어가 μžˆμŠ΅λ‹ˆλ‹€. 그쀑 ν•˜λ‚˜κ°€ express-rate-limitμž…λ‹ˆλ‹€.

$ npm i --save express-rate-limit

μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ κΈ€λ‘œλ²Œ λ―Έλ“€μ›¨μ–΄λ‘œ μ μš©ν•˜μ‹­μ‹œμ˜€.

import * as rateLimit from 'express-rate-limit';
// somewhere in your initialization file
app.use(
  rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // limit each IP to 100 requests per windowMs
  }),
);

info 힌트 FastifyAdapter둜 μž‘μ—…ν•˜λŠ” 경우 fastify-rate-limitλ₯Ό λŒ€μ‹  μ‚¬μš©ν•΄λ³΄μ‹­μ‹œμ˜€.

Last updated

Was this helpful?