본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

[O'REILLY] Node & Express - 18장 : 보안 처리

by VictorMeredith 2023. 4. 17.

1. HTTPS

- 안전한 서비스를 만드는 첫 단계

- 패킷을 암호화해서 공격자가 정보에 접근하기 힘들게 만든다.

- 공개 키 인증서(SSL 인증서)를 둔다.

- 인증서를 발급하는 CA(인증기관, Certificate Authority)가 있다.

- 인증 기관은 브라우저 제조사가 신뢰할 수 있는 루트 인증서를 사용할 수 있게 해준다.

- 서버에 반드시 CA가 발급하는 인증서를 사용해야 한다.

- HTTPS를 사용하려면, CA에서 인증서를 받아야 한다. 무료/유료 둘 다 있다.

 

2. 인증서 직접 생성

- 개발과 테스트 목적에만 사용해야 하는 인증서.

- 인증서는 계층 구조를 가지므로 브라우저는 자신이 알고 있는 CA에서 생성한 인증서만 신뢰한다.

- 개인적으로 만든 인증서는 신뢰하지 않는다.

- 그래도 개발/테스트 목적애서 인증서를 만드는 작업을 해보자.

 

 1) OpenSSL 설치 (Mac은 brew 씀)

brew install openssl

 2) 윈도우는 검색해서 설치하면 된다.

 

 3) 개인 키와 공개 인증서 생성

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout meadowlark.pem -out meadowlark.crt

- 이런식으로 명령하면 crt파일이 만들어진다.

- 다양한 옵션들이 있으며, 자세한 설명은 OpenSSL 문서를 참고하면 되나, 어차피 실무에서 쓸 일은 없으니 구조만 잘 파악하자.

- crt파일을 보내서 보안 연결을 만드며, .pem 파일은 개인 키 파일이고 클라이언트에 전송해서는 안된다.

 

3. 무료 인증 기관

- 보안 인프라를 구축하고 인증서를 보증하고 브라우저 공급 업체와의 관계유지를 위해서는 돈이 든다.

- 꼭 구입해야하는 것은 아니다. Let's Encrypt는 오픈소스로 만들어진 자동 CA이다.(무료)

 

4. 인증서 구입

- 시만텍, 코모도, 고대디, 글로벌사인 등에서 공급된다.

- 직접 구입하면 1년에 300달러 이상이므로 상당히 부담스럽다.

- 리셀러를 통해 구입하면 일년에 10달러 이하의 가격으로 구매할 수도 있다.

- 10달러짜리와 1500달러짜리 인증서 간의 암호화 수준의 차이는 없다.

- 상업용 인증서를 선택했다면 고려할 것은 세가지 정도이다.

   1) 고객지원 : 고객 지원이 잘 갖춰진 인증기관

   2) 단일도메인, 다중서브도메인, 와일드카드, 다중 도메인 인증서 : 잘 읽어보고 프로젝트에 맞는 인증서를 고르자

   3) 도메인, 기관, 확장(EV)인증서 : 이것도 잘 읽어보자 글 하나에서 다루기에 내용이 너무 많다

 

5. 익스프레스 앱에서 HTTPS 사용하기

- 실무에서는 대단히 드무인 일지만, HTTPS 이해를 위해서 알아두면 도움이 된다.

- 개인 키와 SSL 인증서를 ssl 서브디렉터리에 저장하고(보통은 프로젝트 루트에 저장한다.) http 대신 https 모듈을 사용하며 createServer 메서드에 options 객체를 전달하기만 하면 된다.

이렇게만 하면 된다.

 

6. 포트에 관한 노트

- 포트를 따로 지정하지 않으면 HTTP에서는 포트 80이라고 가정한다.

- 대부분의 프라우저는 80을 기입하더라도 표시하지 않는다.

- HTTPS의 표준포트는 443이다. 브라우저도 비슷하게 동작한다.

- 포트 명시를 피하기 위해 HTTP앱을 80에서, HTTPS를 443에서 실행한다면 염두할 것이 두 가지 있다.

- 첫 번째는 대부분의 시스템에서 웹서버는 기본적으로 80에서 실행된다는 점이다.

- 두 번째는 대부분의 운영체제에서 포트1~1023번은 높은 권한이 있어야 열 수 있다는 점이다.

- 관리자 권한이 없다면 포트80이나 443에서 직접 서버를 열 수는 없다.

- 서버 직접 관리가 아니라면 호스트 계정에 루트 권한은 없다.

- 그래서 대부분의 호스팅 제공자가 관리자 권한으로 일종의 프록시 서비스를 운영하며, 이 서비스에서 앱에 대한 요청을 낮은 권한의 포트로 보낸다. 이는 다음장에서 알아보자

 

7. HTTPS와 프록시

- 결국 실무에서는 NGINX를 도입해서 리버스프록시 서버로 Node-Express 서버의 앞 단에 두어야 한다는 것이다. 결국 배운다.

- 여기서는 그냥 프록시 서버라고 한다. 리버스 프록시라고도 하는데 헷갈리는 경우가 있다. 

- 프록시 서버를 사용한다면 클라이언트는 프록시 서버와 통신하게 된다.

- 앱과 프록시 서버는 신뢰할 수 있는 네트워크에서 함께 실행되므로, HTTPS로 통신하게 된다.

- 프록시서버에서 HTTP 트래픽 전체를 HTTPS로 리디렉트하는 방법을 통해 간단히 보안요청처리를 구축할 수 있다. (즉, 앱과 오로지 HTTPS으로만 통신하는 방법이다. 많이들 사용하고 쉬운 해결책이다. )

- 또다른 방법은 클라이언트 프록시 통신에 사용되는 프로토콜을 서버에 전달하는 것이다. 일반적으로 X-forwarded-Proto 헤더를 사용한다. 아래는 NGINX를 이용한 예제

proxy_set_header X-Forwarded-Proto $scheme;

- 이후 앱에서 https 프로토콜인지 확인한다.

- 이 방법을 사용한다면, 항상 X-Forwarded-Protocol 헤더를 사용하도록 유의해야한다.

- 익스프레스에서는 프록시를 더 투명하게하는 편의 프로퍼티를 제공한다 (즉, 프록시의 장점만 누리면서 프록시를 사용하지 않는 것처럼 만들어주는)

- 이 프로퍼티는 app.enable('trust proxy')로 프록시를 신뢰하도록 설정하면 된다.

- 이 방법을 사용하면 req.protocol, req.secure, req.ip 가 클라이언트 연결을 앱이 아니라 프록시에서 참조한다.

 

8. CSRF

- 사이트 간 요청 위조(CSRF) 공격은 사용자가 일반적으로 브라우저를 신뢰하며 한 세션에서 여러사이트를 방문한다는 사실을 악용하는 공격이다.

- 아래 방법을 참조하면 된다.

- csurf 미들웨어는 요청 객체에 csrfToken 메서드를 추가한다.

- API에는 csurf 미들웨어를 사용하지 않는 편이 좋다. 다른 웹사이트에서 API요청 제한을 하고싶다면 connect-rest의 API키를 이용하는 것이 더 낫다. 

https://victormeredith.tistory.com/131

 

Node-Express 서버에서 CSRF 공격을 방어하는 방법

안녕하세요! 오늘은 Node.js와 Express를 사용하여 구축한 서버에서 CSRF(Cross-Site Request Forgery) 공격을 방어하는 방법에 대해 설명하겠습니다. CSRF 공격은 웹 사이트의 사용자가 자신의 의도와는 무관

victormeredith.tistory.com

 

 

다음 포스팅은 '인증' 의 영역이며, 보안 전문가가 아니어도 알아둬야할 사항이 책 한권은 기본이니, 자세한 공부를 위해서는 전문 책이나 강의를 통해 자세히 익혀야한다.

댓글