문제: Google OAuth 프로젝트는 https 페이지로만 redirect uri를 보낼 수 있다.
해결: http ⇒ https로 변경
EC2는 SSL certificate를 갖고 있지 않아서 https를 지원하지 않기 떄문에 밑의 방법들을 찾아봤다.
Enable HTTPS on EC2 instance Without Elastic Load Balancer
Configure HTTPS on AWS EC2 without a Custom Domain
Configure HTTPS on AWS EC2 for Free Using Cloudflare
그 중 가장 간단해보이는 Route53 방법을 선택했다
route53에서 나만의 도메인을 구입하기
인스턴스와 도메인을 연결하기 위해 record를 추가
subdomain은 webpage, blog등과 같은 도메인의 하위 부분이며, 특정 섹션이나 서비스를 가리키는 데 사용한다. 나는 굳이 필요하지 않아서 안 썼다.
record type은 A를 사용하고
value는 Elastic IP addresses를 추가했다.
SSL
Secure Sockets Layer은 데이터 전송 중에 데이터를 암호화하여 중간에 있는 공격자가 데이터를 읽을 수 없게 한다.
주로 HTTPS프로토콜로 사용. HTTPS default port는 443이다
내 웹사이트를 HTTPS로 만들기 위해서는 CA로부터 certificate를 받아야한다
이때 Let’s Encrypt 를 사용한다
Let's Encrypt의 원리
url창에 나의 도메인을 써넣으면
- DNS가 도메인 ⇒ ip로 변환하고
- let’s encrypt은 (일종의 ca) 이 ip가 진짜 https인지 확인한다
- 이런 확인 방법을 ACME 프로토콜이라고 하는데 그 중 certbot을 사용한다
- certbot를 나의 인스턴스에 설치하면 ca에게 certificate를 제공하여 이 도메인의 서버가 나임을 증명한다.
sudo apt install certbot -y
여기까지 완료하면 certificate이 etc/letsencrypt/live/도메인이름에 잘 저장되어있다.
이제 express에서 https를 configure하는데 이때 SSL 인증서path도 알려준다
const https = require("https");
// SSL 인증서 키
const sslKeys = {
ca: fs.readFileSync("/etc/letsencrypt/live/ujung.link/fullchain.pem"),
key: fs.readFileSync("/etc/letsencrypt/live/ujung.link/privkey.pem"),
cert: fs.readFileSync("/etc/letsencrypt/live/ujung.link/cert.pem"),
};
httpsServer = https.createServer(sslKeys, app);
httpsServer.listen(443, () => {
console.log("[PRO]Listening on 443");
});
근데 인스턴스에서 실행하니 node가 인증서에 접근 할 수 없었다.
해결링크를 따라 해결하니 정상적으로 도메인에 접근할 수 있었다
참고: lets encrypt pem, key가 잘 있는지 확인하기
'백엔드' 카테고리의 다른 글
[mySQL] 명령어 정리 (0) | 2024.01.08 |
---|---|
AWS EC2 배포하기 with React, Express (0) | 2024.01.08 |