최근에 http로 서버를 열었다가 낭패를 본 경험이 있었다. 그래서 이것을 해결하기 위해서 SSL 인증서를 도입함과 동시에 공부도 할 겸 도메인 적용까지 하기로 했다. 이걸 하겠다고 이틀동안 별 짓을 다 했던것 같다. 그래도 결과는 나름 잘 나온다고 생각한다.
최종 결과
1. SSL 인증서가 적용되어 주소창 왼쪽에 자물쇠 아이콘이 뜬다.
2. http 로 접속해도 https로 접속이 가능하다.
3. 포트 번호 및 아이피 주소가 포함된 주소가 아닌 도메인 주소로 표기된다.
도메인 구매
먼저, 도메인을 구매해야 한다. 여기서 도메인이란, 주소를 의미한다. 예를들어 naver.com 또는 google.com 같은 주소를 말한다. 도메인 주소를 구매할 수 있는 곳은 여러곳이 있다. 국내 기준으로 보면 호스팅kr 또는 가비아를 많이 이용하는 것 같았다.
https://www.hosting.kr/
국내 사이트의 공통점이라고 하면, 첫 1년 호스팅비는 매우 저렴하나 갱신 비용이 꽤 드는 것을 알 수 있었다. 개인 개발자에게는 약간 부담되는 가격이였기에 해외 도메인 사이트를 둘러 보았다. 여러 사이트를 추천했으나, 본인의 경우에는 비용을 최우선으로 생각해서 sav를 선택했다.
https://www.sav.com/
이곳의 가장 큰 장점은 역시 가격이다. 하지만 해외 사이트인 만큼, 서비스는 솔직히 장담을 할 수가 없었다. 그래도 이번 도메인 구매는 좋은 경험이라고 생각하고 바로 3년치 비용을 지불했다. 3년치 도메인의 가격은 17달러였다. 대부분의 국내 도메인 업체의 연장 비용이 2만원선 이라는 것을 감안하면 가격으로는 크게 메리트가 있어 보였다. 이제 구입한 도메인 주소를 EC2 서버와 연결시켜주자.
EC2 인스턴스와 도메인 연결
Route53 에 호스팅 영역에서 호스팅 영역 생성을 클릭한다.
구입한 도메인 주소를 입력한다. 나머지는 기본값으로 설정했다.
호스팅 영역을 생성하게 되면 NS 유형과 SOA 유형이 생긴다. 도메인 호스팅을 위한 기본적인 값들이 생기게 된다. 그 이후에 레코드 세트를 생성하여 ec2와 연결해야 한다. 레코드 생성을 클릭한다.
레코드 생성에서 무엇을 입력해야 하는지 확인하자.
먼저 레코드 이름을 보자. 레코드 이름은 도메인 주소 앞에 접두사를 붙여 해당 주소에 대한 규칙을 만들 수 있다. 예를들어 abc.xyz 도메인을 구매 후 mail.abc.xyz 주소를 적용하려 할 때, 레코드 이름에 mail을 넣으면 된다.
다음 레코드 유형은 특정한 목적의 서버가 아닌 이상 A 유형을 고르면 된다.
값은 아이피 주소를 입력하면 된다. 주의해야 할 점은 로드밸런서 또는 EB 등에는 바로 접속이 가능하나 EC2에는 바로 접속이 불가능하다. EC2와 Elastic IP를 연결한 다음, Elastic IP을 연결해준다. (나중에 SSL 적용 시에는 필요없는 부분)
레코드 세트 생성이 완료되면, 네임서버 4개가 생길 것이다. 이 4개의 네임서버를 도메인을 구매한 사이트의 네임서버에 복붙해준다. 그렇게 하면 도메인과 EC2 인스턴스가 연결이 될 것이다!
만약 연결이 안된다면, 보안 그룹에서 80번 포트를 막아두었을 수도 있기 때문에 보안 그룹에서 80번 포트를 inbound 룰에 추가한다. 당연히 서버를 3000번 포트에서 열었다면 [서버주소:3000] 으로 접속이 될 것이다. (80번 포트는 http 접속, 443 포트는 https 접속)
서버 완성도 높이기 : 포트번호 삭제
서버에 접속하게되면 주소 뒤에 포트번호가 붙게 될 것이다. 솔직히 좀 불편하다. 이를 해결하기 위해 포트포워딩을 통해서 80번 포트를 서버의 포트로 옮겨주자. (80번 포트는 http 연결의 기본 포트이다. 그리고 나중에 SSL 인증서를 적용하기 위해 로드밸런서를 사용하게 되면, 이 작업은 필요가 없어진다.)
https://srzero.tistory.com/entry/Ubuntu-Iptable-nat-%EC%A1%B0%ED%9A%8C-%EB%B0%8F-%EC%84%A4%EC%A0%95-%EC%82%AD%EC%A0%9C
서버 완성도 높이기 : HTTPS 접속
https 접속을 못하는 웹사이트들은 브라우저에서 막고 있는 추세이다. 정상적인 웹사이트를 운영하고 싶으면 장기적인 관점으로 보았을 때 https 접속을 하게 해야 한다. http 와 https 접속의 차이점은 SSL 인증서가 있느냐 없느냐의 차이이다. 간단히 말하면은 SSL 인증서가 적용된 사이트는 https로 접속이 가능하고, SSL 인증서는 사이트의 보안을 검증하는 보증서 같은 느낌이다. SSL 인증서를 적용하여 안전한 사이트임을 증명해 보자.
먼저 certificate Manager에 접속해서 인증서를 받아보자. 인증서 프로비저닝 -> 공인인증서를 요청한다.
내가 가진 도메인에 대해서 SSL 인증서를 적용할 것이므로 내 주소를 입력한다. 여기서 내 도메인과 관련된 모든 주소에 대해서 SSL 인증서를 적용할 예정이므로, 맨 앞에 glob (*)을 붙여서 입력한다.
그 이후 검증을 해야 한다. 대부분의 사람들은 도메인에 대해서 mail 서버는 없을 것이다!! DNS 검증으로 선택하자.
SSL 인증서를 생성한다고 끝이 아니다. 이 주소가 과연 내 소유가 맞는지 확인해야 한다! 이를 입증하기 위해서는 Route53에서 레코드를 생성하여 연결을 완료해야 한다. 적용하기까지 정말 귀찮은 작업이 많지만, 뭐 어쩌겠을까. 하라는 대로 하자. [Route53에서 레코드 생성]을 클릭한다. 클릭하게 되면 레코드에 CNAME 항목이 생성이 된다.
이제 로드밸런서를 만들어서 Route53과 EC2를 연결해야 한다. EC2 -> 로드밸런서 에서 로드밸런서를 생성한다. 사용하기 무난한 Application 로드밸런서를 생성하자. 옵션이 뭔가 참 많은데, 나의 경우에는 다음과 같이 설정했다.
Schema : internet Interfacing
IP address type : ipv4
Network Mapping : 연결할 ec2가 있는 VPC 및 리전으로 모두 선택한다.
Security Group : 만들던지, 원래 있던거 쓰던지. 22, 80, 443 등의 원하는 포트를 열어두면 좋을것 같다.
Listner and Routing : 80번과 443번 포트 열어두기 (여기서 타깃 그룹을 먼저 만들어야, 연결할 수 있다!)
Security Listner : HTTPS와 443포트 입력 후, default SSL certificate에서 만들어둔 인증서를 선택한다. 만약 항목에 없으면 로드밸런서 생성 후 리스너 생성에서 따로 만들어도 된다.
타깃 그룹은 꼭 443번 포트를 열지 않아도 된다. 80번 포트로 ec2와 연결해주자. 타깃 그룹 생성 후 로드밸런서와 연결하면, EC2와 로드밸런서는 연결이 된 것이다. 이제 Route53과 로드밸런서를 연결해야 할 차례이다. Route53 -> 호스팅 영역 -> 만들어둔 레코드에 들어간다. 그 이후 앞에서 만들었던 A 타입의 레코드를 수정한다. 트래픽 라우팅 대상에 만들어준 로드밸런서를 연결한다!
이렇게 하면은 https 적용은 모두 완료가 되었다. 적용되기까지 시간이 좀 걸리니, 칼바람 한판 하고 오자.
HTTP -> HTTPS 자동 전환
HTTP로 접속해도 HTTPS로 자동 전환되는 기능도 추가하면 좋을 것 같아서 만들었다. 먼저 로드밸런서 -> 리스너 항목으로 들어간다. 리스너에 80번 포트에 관한 리스너가 있으면, 이것을 지우고 새로 추가한다.
포트 : 80번
리디렉션 지정 -> 포트는 443번, 나머지 설정은 기본값으로 설정한다.
이렇게 하면은 http로 접속해도 자동으로 https로 접속이 된다.
예상치 못한 에러
중간에 도메인으로 접속이 안 되어서 한시간 정도 삽질했던 기억이 있다. 결론은 보안 그룹을 기본값으로 설정했기 때문이였다. 보안 그룹의 기본값은 모든 포트와 모든 트래픽에 대해서 허용한 상태인데, 이러한 보안 그룹을 ALB에 적용시키면 모두 차단시켜 버린다. 보안 그룹을 설정할 때에는 80번 포트와 443번 포트만 열어두자. 심신에 안정을 주는 좋은 설정이다.
후기
SSL 접속은 정말 해줄게 많다고 생각했다.
'서버 인프라 > Aws' 카테고리의 다른 글
Typescript를 이용한 어플리케이션 Lambda에 배포하기 (0) | 2022.06.15 |
---|---|
AWS configure (cli) 다중 계정 사용하기 (0) | 2022.06.14 |
EC2 인스턴스 안에 있는 파일 로컬에 다운받기 (0) | 2021.09.16 |
RDS 접속 시 ec2 인스턴스 통해서 접속하기 (0) | 2021.09.06 |
EC2 리눅스 인스턴스 포트포워딩 하기 (0) | 2021.09.05 |