Express Helmet - boostcamp-2020/Project03-A-TOTP GitHub Wiki

Helmet.js ๋ž€?

Express.js ์‚ฌ์šฉ์‹œ Http ํ—ค๋” ์„ค์ •์„ ์ž๋™์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ์–ด ์ž˜ ์•Œ๋ ค์ง„ ๋ช‡๊ฐ€์ง€ ์•ฑ์˜ ์ทจ์•ฝ์„ฑ์œผ๋กœ ๋ถ€ํ„ฐ ์•ฑ์„ ๋ณดํ˜ธ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€์ด๋‹ค.

์—ฌ๋Ÿฌ ๋ณด์•ˆ ํ—ค๋”์— ๊ด€ํ•œ ์ •๋ณด

CSP ๋ณด์•ˆ์„ค์ •

Helmet๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ด๋ฃจ์–ด ์ ธ ์žˆ๋‹ค.

csp

  • Content-Security-Policy ํ—ค๋” ์„ค์ •. XSS(Cross-site scripting) ๊ณต๊ฒฉ ๋ฐ ๊ธฐํƒ€ ๊ต์ฐจ ์‚ฌ์ดํŠธ ์ธ์ ์…˜ ์˜ˆ๋ฐฉ.

hpkp

  • Public Key Pinning ํ—ค๋” ์ถ”๊ฐ€. ์œ„์กฐ๋œ ์ธ์ฆ์„œ๋ฅผ ์ด์šฉํ•œ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ ๋ฐฉ์ง€. (์‚ญ์ œ๋จ)

hsts

  • SSL/TLS๋ฅผ ํ†ตํ•œ HTTP ์—ฐ๊ฒฐ์„ ์ ์šฉํ•˜๋Š” Strict-Transport-Security ํ—ค๋” ์„ค์ •.

noCache

  • Cache-Control ๋ฐ Pragma ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•จ. (์‚ญ์ œ๋จ)

frameguard

  • X-Frame-Options ํ—ค๋” ์„ค์ •ํ•˜์—ฌ ํด๋ฆญ์žฌํ‚น(clickjacking)์— ๋Œ€ํ•œ ๋ณดํ˜ธ ์ œ๊ณต
    • ํด๋ฆญ์žฌํ‚น ๊ณต๊ฒฉ: ๊ฐ€์งœUI๋กœ ์‚ฌ์šฉ์ž์˜ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ (๊ฐ€์งœ๋ฒ„ํŠผ ๋“ฑ)
  • ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ํ”„๋ ˆ์ž„ ๋‚ด๋ถ€์˜ ์ปจํ…์ธ ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง๋  ์ง€ ์•Œ๋ ค์ค€๋‹ค
  • ๊ธฐ๋ณธ๊ฐ’์€ SAMEORIGIN์œผ๋กœ origin์ด ๋‹ค๋ฅด๋ฉด ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค
  • X-Frame-Options ํ—ค๋”๋Š” CSP์˜ frame-ancestors ์ง€์‹œ๋ฌธ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์ง€๋งŒ, ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์œ ์šฉํ•˜๋‹ค

ieNoOpen

  • X-Download-Options ํ—ค๋”๋ฅผ noopen์œผ๋กœ ์„ค์ • (IE8 ์—์„œ๋งŒ ์ ์šฉ)
  • ์œ„ํ—˜ํ•œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ๋•Œ ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด '์—ด๊ธฐ'๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋œ๋‹ค

xssFilter

  • X-XSS-Protectionํ—ค๋”๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”
  • X-XSS-Protectionํ—ค๋”๋ฅผ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž๋“ค์„ ์œ„ํ•ด ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณด์•ˆ์ ์ธ ์ด์ ์„ ์ฃผ๊ธฐ ๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์Šˆ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ๊ฐ’
  • ์ตœ์‹  ์›น ๋ธŒ๋ผ์šฐ์ €๋“ค์€ ๋Œ€์‹  Content-Security-Policy ํ—ค๋”๋กœ XSS๋ฅผ ๋ฐฉ์–ดํ•จ

noSniff

  • X-Content-Type-Options๋ฅผ nosniff๋กœ ์„ค์ •ํ•œ๋‹ค
  • ์„ ์–ธ๋œ ์ฝ˜ํ…์ธ  ์œ ํ˜•์œผ๋กœ๋ถ€ํ„ฐ ๋ฒ—์–ด๋‚œ ์‘๋‹ต์— ๋Œ€ํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ MIME ๊ฐ€๋กœ์ฑ„๊ธฐ๋ฅผ ๋ฐฉ์ง€
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์— ๋ช…์‹œ๋œ MIME Type๊ณผ ์‹ค์ œ ํŒŒ์ผ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค

dnsPrefetchControl

  • X-DNS-Prefetch-Control ํ—ค๋”๋ฅผ ์„ค์ •
  • ๊ธฐ๋ณธ๊ฐ’์€ off๋กœ, DNS prefetching์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค

permittedCrossDomainPolicies

  • X-Permitted-Cross-Domain-Policies ํ—ค๋”๋ฅผ ์„ค์ •
  • ์ฃผ๋กœ ์–ด๋„๋น„ ํ”Œ๋ž˜์‹œ, ์–ด๋„๋น„ ์•„ํฌ๋กœ๋ฑƒ(PDF)์—์„œ ํฌ๋กœ์Šค ๋„๋ฉ”์ธ ์ปจํ…์ธ  ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ง€์ •ํ•œ๋‹ค
  • ๊ธฐ๋ณธ๊ฐ’์€ none์œผ๋กœ ๋ชจ๋“  ์š”์ฒญ์„ ์ฐจ๋‹จํ•œ๋‹ค

hidePoweredBy

  • ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋˜๋Š” X-Powered-By ํ—ค๋”๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ
  • ๋ณด์•ˆ์ ์œผ๋กœ ํฐ ์ด์ ์€ ์—†๋Š” ๋“ฏ

์˜ˆ์ œ ์ฝ”๋“œ

// This...
app.use(helmet());

// ...is equivalent to this:
app.use(helmet.contentSecurityPolicy());
app.use(helmet.dnsPrefetchControl());
app.use(helmet.expectCt());
app.use(helmet.frameguard());
app.use(helmet.hidePoweredBy());
app.use(helmet.hsts());
app.use(helmet.ieNoOpen());
app.use(helmet.noSniff());
app.use(helmet.permittedCrossDomainPolicies());
app.use(helmet.referrerPolicy());
app.use(helmet.xssFilter());

์ฃผ๊ด€์ ์ธ ์ƒ๊ฐ

ํ˜„์žฌ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ CSRF Token์€ ์ƒ๊ฐ์ฒ˜๋Ÿผ ์ž˜ ์ง„ํ–‰๋˜์ง€์•Š๋Š” ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ์ด๋‹ค. ๊ทธ ์ด์œ ๊ฐ€ Cookie๋กœ ์ €์žฅ๋œ CSRF Token์€ httpOnly ์˜ต์…˜์„ ์ฃผ๊ฒŒ๋˜๋ฉด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค..๐Ÿ˜‚
httpOnly ์˜ต์…˜์„ ์„ค์ •ํ•ด์ฃผ์ง€์•Š์œผ๋ฉด XSS๊ณต๊ฒฉ์— ์ทจ์•ฝํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฌธ์ œ๋กœ ๊ณ ๋ฏผํ•˜๋‹ค ๊ฒฐ๊ตญ httpOnly ์˜ต์…˜์„ ์ฃผ์ง€์•Š๊ณ  CSRF๋ฅผ ๋ฐฉ์–ดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋Š”๋ฐ, ๋ญ”๊ฐ€ ์ฐ์ฐํ•œ ๋งˆ์Œ์ด ํ•œ์ผ ์— ์กด์žฌํ•˜๊ณ ์žˆ์—ˆ๋‹ค.
์ด๋ฒˆ์— Express helmet์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ CSP(Content-Security-Policy ํ—ค๋” ์„ค์ •. XSS(Cross-site scripting) ๊ณต๊ฒฉ ๋ฐ ๊ธฐํƒ€ ๊ต์ฐจ ์‚ฌ์ดํŠธ ์ธ์ ์…˜ ์˜ˆ๋ฐฉ.) ์„ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๊ณ , XSS๊ณต๊ฒฉ์„ ์˜ˆ๋ฐฉํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์กฐ๊ธˆ ์•ˆ์‹ฌํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.