Express Helmet - boostcamp-2020/Project03-A-TOTP GitHub Wiki
Helmet.js ๋?
Express.js ์ฌ์ฉ์ Http ํค๋ ์ค์ ์ ์๋์ผ๋ก ๋ฐ๊พธ์ด์ฃผ์ด ์ ์๋ ค์ง ๋ช๊ฐ์ง ์ฑ์ ์ทจ์ฝ์ฑ์ผ๋ก ๋ถํฐ ์ฑ์ ๋ณดํธ ํ ์ ์๋ ํจํค์ง์ด๋ค.
์ฌ๋ฌ ๋ณด์ ํค๋์ ๊ดํ ์ ๋ณด
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๊ณต๊ฒฉ์ ์๋ฐฉํด์ค๋ค๋ ๊ฒ์ ํ์ธํ๊ณ ์กฐ๊ธ ์์ฌํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ๋ ๊ฒ ๊ฐ๋ค.