AWS EC2에서 HTTPS를 적용하는 과정을 소개한다. 많은 자료들이 있음에도 불구하고, 보안상의 이슈를 발견하고 이를 해결한 경험을 공유하고자 한다. 본 글에서는 다른 자료들과의 차이점에 초점을 둘 예정이다.
먼저 AWS의 Route53 서비스를 이용해 도메인을 구매한다.
원하는 도메인명을 검색하고 등록한다. 가격은 변동이 있으므로 여러 옵션을 검색해보는 것이 좋다. 12달러가 평균이지만 운이 좋다면 5달러 도메인도 발견할 수 있다. 12달러가 평균이지만 운이 좋다면 5달러 도메인도 발견할 수 있다.
호스팅 영역에서 구매한 도메인명을 클릭하여 레코드를 생성한다.
이때, EC2의 Public IP를 값에 입력한다. 이 과정을 통해 도메인을 통한 HTTP 통신이 가능해진다.
AWS Certificate Manager에 들어와 인증서 요청 버튼을 클릭한다.
ACM에 접속하여 퍼블릭 인증서를 요청한다. 완전히 정규화된 도메인 이름에는 본인의 도메인을 입력하고, 필요에 따라 와일드카드 도메인도 함께 신청한다. 나중에 도메인 이름은 프론트엔드가 작동하도록 하고 와일드카드 도메인은 백엔드가 작동하도록 할 수 있기 때문이다.
검증 버튼을 클릭한다. 그 후 인증서 ID를 누르고 Route 53에서 레코드 생성을 누룬다. 그러면 사진과 같이 발급이 완료된다.
로드밸런서는 서버의 과부하 및 트래픽을 분산시켜주는 역할을 한다. HTTPS 사용을 위해 로드밸런서를 적용한다. NGINX를 이용하여 해당 기능을 구현할 수도 있긴하지만, NGINX를 사용할경우 톰켓서버를 실행하기전에 따로 NGINX를 실행하거나 Docker compose를 이용하여 톰켓과 같이 실행하도록 구성해야한다. 하지만 AWS 로드 밸런서를 이용하면, 해당 과정을 수행하지않아도 되고, 외부 서비스에서 작동하기 때문에 EC2서버에 성능적인 부분에서도 이점을 가져갈 수 있다. 해당 서비스를 적용하면 아래와 같이 작동하게 된다.
- 클라이언트의 요청(Request)을 보낸다.
- 해당 요청을 로드밸런서가 HTTPS(port 443) 요청인지 일반적인 HTTP(port 80) 요청인지 판단한다.
- HTTP 요청이면 이 요청을 HTTPS 요청으로 Redirection 한다.
- HTTPS 요청이면 Target Group 의 80번 port (자신이 원하는 port) 로 요청을 포워딩한다.
대상그룹 생성을 진행한다. 진행 중에 대상등록 또는 취소 부분에서 자신의 인스턴스를 등록한다.
그 뒤, 다시 대상그룹에서 대상을 조회했을때 상태가 사진과 같이 Unhealthy일 경우, 상태검사를 수정해주어야한다.
사진과 같이, 자신의 EC2에서 작동하는 톰켓서버에 맞게 수정하면 된다. 인증되지 않은 사용자가 /의 주소로 요청을 보낼경우 401 Unauthorized가 성공코드이기 때문에 성공코드를 401로 설정하였다.
로드밸런스 생성을 진행한다. 진행 중에 보안 그룹 생성에서 로드밸런스를 위한 보안그룹을 생성하는 것을 추천한다. 왜냐하면 자신의 EC2와 같은 보안그룹을 설정할 경우, 불필요한 연결(SSH, http:8080)을 허용하기 때문이다.
보안그룹을 설정할 때는 http:80과 https:443만을 인바운드 규칙에 작성하는 것을 추천한다. 그리고 계속해서 진행한다.
이전에 이야기헀던 로드밸런서 작동과정을 떠올려보자. 만약 http의 요청이 왔을경우에는 https로 리다이렉트를 해주어야한다. 그래서 사진과 같이 수정해준다. 하지만 해당 방법에는 문제가 있다. 바로 GET, POST, PATCH, PUT, DELETE 요청이 모두 GET 요청으로 인식된다는 점이다. 해당 문제를 고려해서 자신의 프로젝트에 맞게 적용해야한다.
호스팅 영역 > A 유형의 레코드를 편집한다. 사진과 같이 별칭 버튼을 누를경우, 로드밸런스로 라우팅할 수 있다.
마지막 과정이다. 현재까지의 과정을 생각해보면 로드밸런서가 http의 port 8080을 이용해서 연결한다. 즉, 해당 port를 제외하고는 연결을 허용할 이유가 없다는 것이다.
그래서 사진과 같이 인바운드 보안규칙을 설정해주었다.
또한 로드밸런서의 연결을 제외하고는 연결을 차단하기 위해서 로드밸런서의 IP를 지정하여 port 8080을 열어주었다. 로드밸런서의 IP 주소는 네트워크 매핑에 VPC 정보를 보면 알 수 있다.
여러 정보들을 찾아보며 EC2 서버에 https를 적용해보았는데, 대부분이 사람들이 로드밸런서의 보안규칙을 EC2와 동일하게 설정하여, 불필요한 연결을 허용하는 모습을 보았다. 나는 해당 과정과 같이 수행할 경우, 굳이 https를 사용하는 이유가 보안때문인데 보안에 취약점이 생기는 것이니 맞지 않다고 생각했다. 그래서 로드밸런서는 http와 https의 기본연결만 허용하고, EC2는 http:8080과 ssh만을 허용하도록 하였다. 또한 허용ip들을 직접 지정하여서 불필요한 외부의 연결을 차단하도록 구성하였다.