[Node.js] express 에서 http 와 https 둘다 사용하기

STEVELOPER·2022년 11월 23일
0

Node.js

목록 보기
2/9

기존 node.js 서버는 http 로만 구동되고 있었는데, client 는 https 를 적용시켰기에
서버또한 같은 보안수준인 https 로 업그레이드해야하는 상황이 발생했다.

하지만 안타깝게도 해당 서버를 http 통신을 통해 요청을 하는 다른 client 도 존재했기에
단순히 https 로 변경할 경우 기존의 client 들이 요청을 할 수 없는 상황이었다.

이런 경우, http 와 https 를 동시에 구동시킬 수 있는데,
express 를 통해 생성한 app 을 httpsServer 모듈로 하나 더 생성하면 됐다.
물론 ssl 인증서를 적용시켜야한다.

const startServer = async() => {
	const app = express();
    const httpServer = http.createServer(app);
    const httpsServer = https.createServer(
        {
            key: fs.readFileSync("blah.key"),
            cert: fs.readFileSync("blah__crt.pem"),
        },
        app
    );

    await new Promise((resolve) => httpServer.listen({ port: PORT }, resolve));
    await new Promise((resolve) =>
        httpsServer.listen({ port: HTTPS_PORT }, resolve)
    );
}

상기와 같이 httpsServer 모듈을 통해 서버를 생성할때 옵션으로 key 와 crt 파일을 지정하고 실행시키면 https 로 접속할 수 있다.

클라우드 서버를 사용할 경우 443 포트가 공인 ip 설정단에서 block 되어 있을 수 있으므로 규칙 설정을 통해 개방해야한다.

ubuntu 에서 node 를 사용하는 project 가 443 포트에서 실행될때 1024 포트 이하로는 실행할 수 없다는 에러를 발생시킬 수 있다.
해당 상황의 경우, 하기의 명령어를 실행하면 된다.

# sudo setcap 'cap_net_bind_service=+ep' `which node`

ssl 의 경우 crt, ca 파일을 하나로 합쳐 사용할 수 있다.

-----BEGIN CERTIFICATE-----
crt 내용
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
ca 내용
-----END CERTIFICATE-----
profile
JavaScript, Node.js, Express, React, React Native, GraphQL, Apollo, Prisma, MySQL

0개의 댓글