[ETC] 운영중인 http 사이트를 https로...

ETC

기존에 공부하면서 만든 사이트는 http로 운영되고 있었습니다.

그런데 사용자가 조금씩 늘고 https도 공부해서 바꿔야 겠다는 생각이 문득 들더군요..

그래서 시도해봤습니다.

가장 좋은 방법은 개발 단계에서 https로 개발해서 오픈했으면 좋았겠지만 실력이나 시간적으로 여유가 없었습니다.

https로 바꾸면서 http의 서비스를 갑자기 막을수는 없고 https로의 유도가 필요했습니다.

처음에는 http 페이지에 xx월 xx일에 http가 만료되니 https로 접속해주세요! 라고 안내할까 했습니다.

하지만 제가 사용자라면 저 문구를 발견하고 https로 다시 접속해야하는 불편함이 분명하게 있을거라 판단했습니다.

고민 끝에 https를 완전히 막지 않고 http로 접근한 사용자에게 https로 강제 이동시키는 방향으로 개발했습니다.

환경

AWS에서 Express로 구성했고 pm2로 관리하고있었습니다.

HTTPS(443) 포트 열기

좌측 메뉴에서 인스턴스를 선택 하고 현재 사용중인 인스턴스의 보안 그룹 이름을 확인합니다.

확인한 보안 그룹 아이템을 선택하여 하단의 인바운드 규칙 탭에서 인바운드 규칙 편집을 선택합니다.

좌측 하단의 규칙 추가를 선택하여 HTTPS를 선택하여 443포트를 열어줍니다.

HTTPS(443) 포트를 8080으로 포트포워딩

저는 기존에도 HTTP(80) 포트를 8000으로 포트포워딩해서 쓰고있었습니다.

이번에는 HTTPS(443) 포트를 8080으로 포트포워딩 설정을 해서 구성할겁니다.

1
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8080

잘 설정되었는지 확인합니다.

1
2
3
4
5
$ sudo iptables -L -t nat 
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:https redir ports 8080
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8000

기존 http 서버 코드를 https로 변경

SSL 인증서 사이트로 부터 받은 파일들을 이용해 createServer의 옵션을 아래와 같이 설정해줍니다.

https_server.js
1
2
3
4
5
6
7
8
9
10
11
// require 생략
const HTTPS_PORT = 8080;
const options = {
key: fs.readFileSync(KEY_PEM_PATH),
cert: fs.readFileSync(CRT_PEM_PATH),
ca : fs.readFileSync(CA_PEM_PATH)
};

https.createServer(options, (req, res) => {
console.log(`SSL Server is running at port ${HTTPS_PORT}`);
}).listen(HTTPS_PORT);

기존 http 서버를 대체할 코드

기존의 8000포트 서버를 8080 https용으로 변경했으니 8000포트의 새 서버를 만들어줬습니다.

http_server.js
1
2
3
4
5
6
7
8
9
const express = require('express'); 
const app = express();
const HTTP_PORT = 8000;
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html')
});
app.listen(HTTP_PORT, () => {
console.log(`Server is running at port ${HTTP_PORT}`);
});

html의 meta 태그를 이용해 즉시 https url로 이동시켜줄겁니다.

index.html
1
2
3
<html> 
<meta http-equiv="refresh" content="0; url=https://YOUR_HTTPS_URL"></meta>
</html>

pm2를 이용해 구동

1
2
$ pm2 start http_server.js --name http_server
$ pm2 start https_server.js --name https_server

잘 구동되는지 확인해봅시다.

1
2
3
4
5
6
7
$ pm2 list 
┌─────┬───────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼───────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 17 │ https_server │ default │ N/A │ fork │ 495678 │ 0M │ 0 │ online │ 0% │ 42.1mb │ ubuntu │ disabled │
│ 3 │ http_server │ default │ N/A │ fork │ 147708 │ 0M │ 0 │ online │ 0% │ 20.3mb │ ubuntu │ disabled │
└─────┴───────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

그리고 실제로 기존 http url로 접속하여 https로 이동시켜주는지 확인하면 작업은 끝납니다.