rimo030 / nestjs-e-commerce-frame

✏️ NestJS로 구현한 Commerce API
48 stars 1 forks source link

Helmet #58

Open kakasoo opened 1 year ago

kakasoo commented 1 year ago

helmet.js

const express = require("express");
const helmet = require("helmet");

const app = express();

app.use(helmet());

// ...
// 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());

Express에는 helmet이라는 라이브러리만 가져다 쓰면 거의 대부분의 공격을 막을 수 있었고, nestjs에서도 마찬가지로 이 라이브러리를 사용합니다. 적용하는 게 별 거 아니기도 합니다만 무엇을 막는 기능인지는 알아두면 좋을 거 같아 공유합니다.

kakasoo commented 1 year ago

각각의 항목들에 대해서

아래는 제가 1~2년 전에 대충 정리한 내용입니다. 읽어봐주세요.

contentSecurityPolicy

XSS 공격을 막는다. ( 완화한다. )

xss ( Cross site scripting )

웹 스크립트에 코드를 작성하여 보안을 훼손하거나 정보를 빼가는 행위다. 예를 들면 이러한 공격에 대비가 되지 않은 검색 창이 있다고 가정할 때, 검색 창에 alert('사용자의 쿠기를 빼갈 수 있는 코드')를 입력하여 실행시키는 것이 있다.

What is Content-Security-Policy (CSP)? CSP instructs the browser how to process certain directives (e.g., code/configurations that instructs the browser to include resources onto the webpage). It was designed to help minimize the impact of attacks that exploit cross-site scripting vulnerabilities. Cross-site scripting is a vulnerability that allows attackers to inject unwanted and/or malicious JavaScript onto a webpage. By default, browsers that do not see a CSP header in an HTTP response will accept all directives, including resources from external domains. Helmet.js does not add a CSP header as part of it’s default configuration. Because CSP can block the inclusion of files and resources from legitimate third-parties (like CDNs), browsers default to an open and permissive CSP to avoid breaking website functionality or negatively impacting user experience. Many modern web apps include JavaScript, CSS, fonts, and other resources from different domains. For example, as a developer, you may decide to use a third-party analytics service that requires you to install a small JavaScript file from another domain. Or, you may choose to include Bootstrap files from a CDN. In reality, there are dozens of use cases for including files and resources from external domains. CSP does not fix cross-site scripting vulnerabilities, but it can help limit the impact of one. As a developer, it’s important to understand how to configure and use CSP as an additional layer of defense-in-depth for your Express app.

위 내용을 쉽게 요약하면, 합법적인 타사의 리소스도 차단한다! 고 되어 있는데, 사실 놀라운 것은 아니다. 내 기준으로 설명할 때, HTTPS를 사용할 때에도 발생한 문제였는데, CSS를 외부에서 import 하는 것들을 포함한 모든 외부 자원들을 의미한다.

dnsPrefetchControl

IP와 DNS도 결국은 프로토콜을 따르기 때문에 핸드 셰이크가 발생한다. 따라서 페이지 뷰가 많은 어떤 특정 사이트에 들어갈 경우, 로딩을 줄이기 위해서 핸드 셰이크를 미리 시작하게 할 수 있는데 이것을 dnsPrefetch라고 한다.

dnsPrefetchControl은, dns 서버와 host 정보를 건네는 것을 막는다. 서버를 불투명하게 하여 보안을 높이는 것이다. dns를 조회하는 것을 없앰으로서 속도를 향상시키는 효과도 있다고 한다.

사실 이 부분은 HTTP에서 자동적으로 일어나는 부분이라서 보안에 무슨 영향이 있겠느냐고 생각할 수도 있겠는데, ( 사실 나도 그렇게 생각했다. )

이렇게 생각해봐야 한다.

카카수라는 사람이 주기적으로 A 은행에 방문하고 있다. 그렇다면 이 사람은 A 은행을 주 거래 은행으로 쓰고 있다거나, 아니면 해당 은행에 투자, 혹은 대출의 목적을 가지고 있지 않을까, 라는 것을 추론할 수 있는 셈이다.

expectCt

HTTP로 들어오는 헤더들을 무시한다. 2021년 6월에 사라진다고 하는데, 이는 구글 정책과 관련이 있는 듯 하다. 2018년 3월 이전의 인증서에는 39개월의 기간을 두고, 나머지는 전부 SCT로 강제하기로 했다.

여기서 CT는 인증서를 뜻하는데, SCT는 signed certification으로, 제대로 된 인증기관이 있는 것을 의미한다. 인증서의 정보와 실제 웹 사이트가 일치하는지 여부를 검사하는 것으로 보인다.

frameguard

이전에 iframe을 사용하여 웹 사이트를 만든 적이 있었는데 (...) 그 때, 보안 이슈를 접한 적이 있었다. helmet에서는 frame ( 현재는 사라진 태그 )와 iframe 등 한 페이지에 여러 프레임이 렌더링되는 것을 막아주는 기능도 가지고 있다. 바로 이 기능이다.

hidePoweredBy

일부 프레임 워크 ( Express도 해당한다 )는 powered-by 라는 헤더에 프레임워크의 이름을 기재한다. 이는 불필요한 데이터 전송일 뿐만 아니라, 혹시 모를 서버의 보안 문제 야기를 방지한다.

hsts

Strict-Transport-Security 라는 뜻으로, HTTP와 HTTPS 중 HTTPS를 선호하도록 강제한다.

ienoopen

인터넷 익스플로러에만 있던 보안 이슈(...) 였던 모양이다. 현재는 사용하지 않는 브라우저이므로 생략한다.

noSniff

Sniff는 MIME 타입을 알 수 없을 때 리소스의 바이트를 확인하여 유형을 파악하는 것을 말한다. 이는 중간에 정보를 가로챌 우려 때문에 막는 것으로 보인다. ( 아마도 프락시 때문일 것 )

permittedCrossDomainPolicies()

일부 클라이언트 (대부분 Adobe 제품)에 도메인 간 콘텐츠로드에 대한 도메인 정책을 알려주는 헤더를 설정합니다 . 자세한 내용 은 OWASP에 대한 설명을 참조하십시오.

referrerPolicy

어느 페이지로부터 이동해왔는지를 나타내는 헤더로 본래 무해해야 하지만, 개인정보가 담긴 페이지 ( 예컨대 비밀번호가 담겨 있는데, 하필 그걸 쿼리로 이동하는 페이지였다면? ) 가 담길 수도 있으므로 제하는 것.

xssFilter

스크립팅을 비활성화한다.