[Node.js] HTTPS 서버 구현하기[Node.js] HTTPS 서버 구현하기

Posted at 2020. 5. 20. 18:22 | Posted in Node.js




※ 해당 포스팅은 AWS EC2 서버에서 node.js v14.3.0 버전으로 테스트한 내용입니다.




참고 : https://nodejs.org/api/https.html

참고 : https://mylko72.gitbooks.io/node-js/content/chapter7/chapter7_5.html

참고 : https://lahuman.github.io/cet_key_to_pem







node.jssocket.io를 이용한 통신을 해야하는 경우가 생겼다.


문제는 https 서버에서 socket통신을 이용하는 경우 "혼합된 컨텐츠 차단", "크로스 도메인 이슈" 에러가 발생하여


해결을 위해 이 경우 HTTPS 서버를 구현하여 해결하였다.






■ HTTPS란?




하이퍼텍스트 전송 프로토콜 보안( HTTPS, Hypertext Transfer Protocol Secure )은 HTTPS 클라이언트와 서버간에 안전한 통신을 제공하는 통신 프로토콜이다.


HTTPS는 보안 기능을 확보하기 위해 전송층 보안TLSTransport Layer Security ) / 보안 소켓층( SSL, Secure Sockets Layer ) 프로토콜 위해 HTTP를 구현한 것이다.




HTTPS는 두 가지 방식으로 보안 기능을 제공한다.


첫번째로 단기간에 사용되는 세션 키 교환을 위해 장기간 사용되는 공개 키와 비밀 키를 사용해 클라이언트와 서버간 데이터 암호화를 진행한다.


또한 인증 기능을 통해 접속하련느 웹 서버가 의도한 서버가 맞는지 확인해 중간자 공격을 방지할 수 있다.








■ HTTPS 서버와 HTTPS 클라이언트를 구현





#01. https 모듈 설치



먼저 https 모듈을 설치해야 한다.


 $ npm install https





#02. crt, key 파일을 pem 파일로 변환하기



※ 해당 cert, key 파일은 AWS EC2에서 제공되는 cert, key 파일을 사용하였다.

    ( 참고 :  )



HTTPS 인증서를 node.js에서 바로 사용하기 위해서는 pem 파일 형식으로 변환하는 작업이 꼭 필요하기에


아래와 같이 작업을 진행해 보도록 하자.




01) KEY 파일 변경하기

 $ openssl rsa -in  custom.key -text > agent-key.pem



02) CRT 파일 변경

 $ openssl x509 -inform PEM -in custom.crt > agent-cert.pem 




#03. HTTPS 서버 실행



# 소스코드

 https.server.app.js

const https = require( "https" );

const fs = require( "fs" );


// HTTPS 클라이언트 생성

const options = {

      hostname : "wickedmiso.com"

    , port : 443                                                                              

    , path : "/"

    , method : "GET"

    , key : fs.readFileSync( "/etc/pki/tls/private/agent-key.pem", "utf8" )

    , cert : fs.readFileSync( "/etc/pki/tls/certs/agent-cert.pem", "utf8" )

    , agent : true

};


options.agent = new https.Agent( options );


// HTTPS 서버 생성

https.createServeroptions, ( req, res ) => {

    res.writeHead( 200 );

    res.end( "HTTPS, Hypertext Transfer Protocol Secure\n" );

}).listen( 52273, function() {

    console.log( "Server Running at https://localhost:52273" );

});






// 도메인 주소

// https 기본 포트 443



// key 옵션은 SSL을 위한 개인키를 지정한다.

// cert값은 사용할 x509 공개키를 지정한다.

// 크로스 브라우저 처리를 위한 userAgent 프로퍼티



// 맞춤형 Agent 객체를 생성한다.

// agent : false인경우 주석처리하여 비활성화 한다.










# 출력결과






Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기