http를 https로 적용하기 (feat. ec2/node.js)

202302월 14



https(SSL/TLS)란 무엇인가


HTTPS는 하이퍼텍스트 전송 프로토콜 보안의 약자입니다. 클라이언트(웹 브라우저 등)와 서버 간에 교환되는 데이터를 암호화하여 인터넷을 통해 안전하게 통신하는 데 사용되는 프로토콜입니다. HTTPS는 SSL/TLS 암호화를 사용하여 비밀번호, 신용카드 번호 및 기타 개인 데이터와 같은 민감한 정보를 권한이 없는 당사자가 가로채서 읽지 못하도록 보호합니다. 일반적으로 온라인 쇼핑, 뱅킹 및 기타 민감한 데이터 전송과 같은 온라인 거래에서 안전한 통신을 위해 사용됩니다.

즉 기존의 http 주소에 s(SSL/TLS) 인증서를 적용하게 되는 방식입니다.

저는 토이 프로젝트를 진행하면서 front, back의 배포한 곳이 각각 달랐는데 front는 vercel로 배포

하다 보니까 vercel은 자동으로 https로 apply 시켜주더군요 하지만 back은 ec2로 deploy 하다 보니까

http로 적용이 되었고요. https와 http가 서로 통신이 되지 않습니다. 그 이유는

HTTP와 HTTPS는 서로 다른 두 가지 프로토콜로, 서로 다른 통신 방법과 포트를 사용하여 데이터를 전송합니다. HTTP는 포트 80을 사용하는 반면, HTTPS는 포트 443을 사용합니다. 따라서 HTTPS를 실행하는 서버는 포트 80을 통해 전송된 요청에 응답할 수 없으며, 마찬가지로 HTTP 서버도 포트 443을 통해 전송된 요청에 응답할 수 없습니다.

클라이언트가 HTTP 또는 HTTPS를 통해 서버에 연결을 시도하면 해당 포트 번호를 사용하여 연결을 설정합니다. 서버가 클라이언트가 사용 중인 포트를 통해 요청을 수락하도록 구성되지 않은 경우 연결이 실패합니다. 또한 HTTPS 연결에서는 클라이언트가 서버의 디지털 인증서를 확인하여 서버가 합법적이고 신뢰할 수 있는 엔터티인지 확인해야 합니다. 서버에 유효한 디지털 인증서가 없거나 클라이언트가 인증서를 신뢰하지 않는 경우 연결이 설정되지 않습니다.

요약하자면, HTTP와 HTTPS는 서로 다른 통신 방법과 포트를 사용하는 두 가지 프로토콜이며, 성공적인 연결을 설정하려면 특정 구성과 인증 단계가 필요합니다.



SSL/TLS 인증서 적용할려면 무엇이 필요할까?


그렇다면 https로 적용을 시키려면 어떻게 해야 할까요? ec2에 적용하려면 여러 가지가 필요합니다.

실제 도메인, AWS Certificate Manager, LoadBalancer, Amazon Route 53

  1. 실제 도메인 : 기존 ec2로 배포하였을 경우에는 퍼블릭 IP4 주소가 주어졌을 것입니다. 하지만 인증서를 적용하려면 실제 도메인 주소가 필요합니다.

  2. AWS Certificate Manager : SSL/TLS 인증서를 생성해주는 곳입니다.

  3. LoadBalancer : AWS에서 로드 밸런서의 역할은 들어오는 트래픽을 여러 타깃에 분산하고, 애플리케이션의 가용성, 확장성, 보안, 성능을 개선하며, 전송 중인 민감한 데이터를 HTTPS로 암호화, 트래픽 관리 및 모니터링을 위한 고급 기능을 제공하는 것입니다

  4. Amazon Route 53 : DNS(도메인 이름 시스템) 서비스입니다. 라우트 53에는 A 레코드, AAAA 레코드, CNAME 레코드, MX 레코드, NS 레코드, PTR 레코드, SOA 레코드, SRV 레코드 등 다양한 유형의 레코드가 있습니다. 각 유형의 레코드는 도메인 이름을 IP 주소에 매핑하거나(A 레코드), 도메인 이름을 다른 도메인 이름에 매핑하거나(CNAME 레코드), 도메인의 메일 서버를 지정하는(MX 레코드) 등 특정 용도로 사용됩니다.



이제 적용을 해볼까?

저는 이미 https를 적용하고 나서 작성하는 것이기 때문에 status 값이 여러분들과 다를 수 있습니다. 우선 처음으로 실제 도메인을 구매하겠습니다. 저는 gabia라는 곳에서 구매했습니다.

도메인 구입


가비아

회원가입이나 로그인을 진행해주시구요.

처음 들어가시면 도메인을 입력하는 곳이 존재할 텐데 본인이 원하시는 도메인이름을 입력하시면 여러 가지 가격표들이 존재할 것 입니다. 그중에서 원하시는 거로 구매하시면 됩니다. 그 후 My 가비아의 서비스 관리 탭이 들어가게 되면 구매하신 주소가 있을 텐데 관리 버튼을 누르시면

이렇게 네임서버가 존재합니다. 여기있는 1,2,3,4차 값들을 나중에 변경할 겁니다.

SSL 인증서 발급


SSL 인증서 발급 받아야 하는데 저희는 AWS Certificate Manager에서 발급받겠습니다. AWS Certificate Manager로 이동해 인증서 요청 버튼을 클릭하시면

퍼블릭 인증서로 선택하신 후에 다음 버튼을 클릭하시면 인증서 설정을 하실 수 있습니다.

이곳의 도메인 이름에 아까 가비아에서 구입하신 도메인 주소를 입력하시면 됩니다. 여기서 와일드카드 인증서를 사용할 수 있는데 와일드카드 인증서란

웹사이트와 방문자 간에 HTTPS 프로토콜을 사용하여 안전하게 통신할 수 있도록 하는 디지털 인증서입니다. 와일드카드 인증서는 특정 도메인 이름의 하위 도메인에 얼마든지 사용할 수 있기 때문에 와일드카드 인증서라고 합니다. 예를 들어 *.example.com에 대해 발급한 와일드카드 인증서는 www.example.com, blog.example.com, api.example.com 등에 사용할 수 있습니다. 이렇게 하면 각 하위 도메인에 대해 별도의 인증서를 보유하는 것에 비해 인증서 관리를 간소화하고 비용을 절감할 수 있습니다.

저는 EC2의 node 서버의 주소들이 node-server/api/users, node-server/api/calendar 이런 식이기 때문에 와일드카드를 사용하지 않겠습니다. 검증 방법은 DNS 검증으로 키 알고리즘은 RSA 2048 알고리즘을 사용하는데 설명하자면

RSA 2048은 2048비트 키 크기를 사용하는 공개 키 암호화 알고리즘의 일종입니다. 매우 안전한 것으로 간주되며 온라인 통신 및 거래를 보호하는 데 일반적으로 사용됩니다.

그리고 밑에 태그를 설정하실수도 있습니다. 태그에 관해서도 설명하자면

AWS에서 태그는 인스턴스, 볼륨, 버킷과 같은 AWS 리소스에 할당할 수 있는 메타데이터 레이블입니다. 태그는 키-값 쌍으로 구성되며, 키는 레이블을 설명하는 문자열이고 값은 레이블에 대한 정보를 포함하는 문자열입니다. 태그는 리소스를 구성하고 분류하는 데 유용할 뿐만 아니라 비용 할당 및 리소스 관리에도 유용합니다. 태그를 사용하여 목적, 소유자, 환경 또는 조직과 관련된 기타 기준에 따라 리소스를 식별하고 그룹화할 수 있습니다.

저는 태그는 따로 붙이지 않겠습니다.

그 후 인증서가 생성이 된 후에 인증서와 Route 53을 연결해야 합니다. 인증서의 ID를 클릭하시면 상세 정보가 나오는데 그중 도메인 탭에서 Route 53에서 레코드 생성을 클릭하신 후 또 레코드 생성을 클릭하시면

성공적으로 생성됩니다.

그전에 Route 53에 생성된 레코드에서 NS 유형의 값 4가지를 가비아 네임 서버에 적용해야 합니다. 위의 4가지 주소를 가비아 도메인 상세정보의 네임 서버에 1,2,3 4차 값들로 변경해주세요.

또한 Route 53에 CNAME이 추가된 것을 확인하면 됩니다.

로드 밸런서


EC2 > Load balancers 탭에 들어가 Create load balancer 버튼을 클릭합시다.

타입을 지정할 수 있는데 로드 밸런서의 여러 가지 기능 중에 https 적용을 원하기 때문에 Application Load Balancer의 Create 버튼을 클릭하면 됩니다.

로드 밸런서의 설정을 할 수 있는데 Basic configuration에서 Load balancer name 이름을 임의로 입력해주시고 Network mapping에서는 VPC(가상 사설 클라우드)는 기본 설정을 해주신 후 Mappings은 로드 밸런서가 등록된 대상에 트래픽을 분산하는 데 사용해야 하는 해당 VPC 내의 특정 서브넷 및 IP 주소를 나타냅니다.

저는 모든 영역을 체크해두겠습니다.

Security groups에서는 로드밸런서를 적용할 보안 그룹을 선택해야 하는데 선택한 보안 그룹에는 반드시 http 80 포트와 https 443 포트가 열려있어야 합니다. 만약 열리지 않았다면 보안그룹으로 이동해 인바운드 규칙에서 열어줘야 합니다. 저는 전에 작성한 모든 포트를 개방한 보안 규칙을 적용했습니다.

리스너를 설정할 수 있는데 두 가지를 만들어줘야 합니다. 하나는 포트 80의 HTTP 트래픽에 대한 리스너이고 다른 하나는 포트 443의 HTTPS 트래픽에 대한 리스너입니다. 로드 밸런서는 이러한 포트에서 들어오는 트래픽을 수신 대기하고 등록된 대상으로 전달하여 처리합니다.

Default action에 타겟 그룹을 설정해줘야 하는데 우린 지금 만들어놓은 타겟 그룹이 없습니다. 타겟 그룹을 저희가 생성한 EC2 인스턴스로 변경해야 됩니다. Create target group을 클릭해서 만들어봅시다.

기본설정은 instances로 설정한후

그룹 이름은 원하시는 대로 작성해주신 후 프로토콜은 http, 포트는 80으로 맞춰야 합니다. ec2인스턴스가 http의 80 포트를 이용하기 때문입니다. 그 후 Next를 클릭하신 후

로드밸런서를 적용할 인스턴스를 클릭해주고 밑에 Include as pending below 버튼을 클릭합니다. 그 후 Create target group을 클릭하시면 타겟 그룹이 생성됩니다. Listener으로 돌아가서

방금 생성한 타겟 그룹을 http:80, https:443의 Default action에 설정하면 됩니다. 저는 전에 이미 로드밸런스를 생성했기 때문에 사용하지 못합니다. (사진은 예시일 뿐입니다.) 여러분들은 반드시 타겟그룹을 설정해야 합니다. create load balancer를 클릭해 생성합시다.

이제 Route 53으로 다시 이동합니다.

이동 후 기존에 존재하는 A타입의 레코드를 편집하는데 로드 밸런서 선택 INPUT에 방금 만든 로드밸런서를 만들면 끝납니다.

이렇게 적용이 모두 다 끝나게 되면은 저희가 구매한 도메인을 HTTPS로 접속이 가능해집니다.

저는 / 주소에 대한 route를 설정하지 않았기 때문에 제가 설정해둔 error 로직이 실행됩니다.



참고 문서

EC2로 배포한 Next.js 프로젝트 https 적용하기