[aws] spring 서버 https 적용하기
상황
서버는 임시로 만들어준 ec2에서 실행되고 있으며 프론트는 [AWS] React 배포하기 (S3, CloudFront 설정부터 https 배포까지) 블로그 글을 보고 배포해 준 상태입니다.
설정해 준 도메인을 따라 들어가면 제대로 된 화면이 나오지만 어째서인지 서버로부터 데이터를 불러오지 못하는 에러를 발견할 수 있습니다.
브라우저의 검사 - 네트워크에 들어가서 에러를 확인해 보면 blocked mixed content로 나옵니다.
해당 에러는 HTTPS로 암호화된 웹 사이트에서 HTTP로 암호화되지 않은 다른 사이트로 요청을 보내는 경우 발생합니다.
따라서 spring 서버 또한 HTTPS를 적용하기로 결정하였습니다.
html에 <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 를 넣어도 해결된다고 합니다.
참고 사이트 : https://wellsw.tistory.com/34
적용
ec2에 SSL 인증서를 적용하고 끝. 하면 좋겠지만 생각보다 추가적인 작업이 많이 있습니다.
전체적인 흐름은 다음과 같습니다.
위 그림과 같이 저희가 사용할 서비스는
도메인과 관련된 Route 53,
인증서와 관련된 Certificate Manager
그리고 서버와 관련된 EC2(로드 밸런서, 대상그룹)입니다.
이제 하나씩 진행하면서 알아보겠습니다.
1. ec2 인스턴스 생성
본인이 사용할 OS를 지정해 주시면 됩니다.
저는 많이 사용해 본 우분투와 프리티어 위주로 선택해 주었습니다.
키 페어는 나중에 SSL로 서버에 접속할 때 필요하니 만들어 준 뒤에 잘 보관해 주시면 됩니다.
보안그룹은 외부에서 인스턴스로 들어오는 트래픽을 설정해 줄 수 있습니다.
일단 위와 같이 설정해 줍니다.
프리티어임으로 30으로 설정해 줍니다.
그 외에 나머지 설정은 기본값으로 내버려 두고 인스턴스를 생성해 줍니다.
인스턴스가 만들어지면 보안 -> 보안그룹 -> 인바운드 규칙 편집으로 들어가서 8080 포트를 추가해 줍니다.
(본인의 서버 포트를 지정해 주면 됩니다.)
위 이미지처럼 총 4개의 규칙이 있으면 됩니다.
2. 도메인 연결 및 인증서 적용
Route 53의 호스팅 영역에 들어가서 레코드를 하나 생성해 줍니다.
(만약 아직 도메인을 구매하지 않으셨다면 대시보드에서 도메인 등록을 하시면 됩니다.)
임시로 방금 만들어 준 ec2 인스턴스의 ip값을 지정해 줍니다.
(나중에 라우팅 대상을 로드 밸런서로 바꿉니다.)
이제 만들어 준 레코드의 이름으로 SSL 인증서를 발급받아줍니다.
Certificate Manager에 들어가서 인증서 요청을 해줍니다.
도메인 이름 = 레코드 이름으로 설정해 주고 나머지는 기본값으로 설정해 주면 됩니다.
3. 대상그룹 생성
ec2의 왼쪽 목록에 대상 그룹을 선택해서 들어간 뒤에 대상 그룹 생성을 눌러줍니다.
거의 기본값 그대로 내버려 두면 됩니다.
참고로 위 포트를 HTTPS로 지정해 주면 나중에 502 Bad gateway 오류가 발생할 수 있습니다.
상태검사는 주기적으로 ec2 인스턴스에 요청을 보내 연결 상태를 확인해 주는 기능입니다.
저는 spring 서버에 /health/check 요청에 200을 반환해 주도록 미리 만들어주었습니다.
그 외에 제한 시간과 간격을 여유 있게 늘려주었습니다.
다 설정해 준 뒤에 다음을 누릅니다.
아까 만들어준 인스턴스를 선택하고 8080 포트를 지정해 준 뒤에 "아래에 보류 중인 것으로 포함 버튼"을 누르고 대상 그룹을 생성해 주면 됩니다.
추후 로드밸런서로 443 포트로 요청이 오면 대상그룹을 통해 인스턴스로 8080 포트로 전달하게 됩니다.
(정확하지는 않지만 포트 포워딩 역할로 이해하고 있습니다.)
시간이 지나서 위와 같이 Healthy가 뜨면 성공입니다.
만약 unHealthy가 뜰 경우에는
- ec2의 인바운드 규칙에 8080 포트를 설정해 줬는지 확인하시면 됩니다.
- 상태검사 요청이 올바른지 확인하시면 됩니다.
4. 로드밸런서 생성
ALB로 생성해 줍니다.
가용영역은 아까 만들어 준 인스턴스의 가용영역과 그 외에 아무거나 하나를 선택해 줍니다. 최소 2개
(인스턴스의 가용영역은 인스턴스 -> 네트워킹에서 확인할 수 있습니다.)
보안 그룹은 인바운드 규칙에 http랑 https가 열러 있는 것으로 선택해 줍니다.
리스너로 HTTP와 HTTPS를 지정해 주고 아까 만들어 준 대상그룹을 지정해 줍니다.
인증서는 아까 Certificate Manager에서 만들어 준 인증서를 지정해 주면 됩니다.
나머지는 기본값으로 로드 밸런서를 생성해 주면 됩니다.
4. route 53에 로드 밸런서 연결
아까 만들어준 레코드의 라우팅 대상을 ec2 인스턴스에서 로드 밸런서로 변경해 주면 됩니다.
route 53 -> 호스팅 영역 -> 호스팅 선택 -> 아까 만들어준 레코드 편집
위처럼 설정해 준 뒤 저장해 주면 됩니다.
이제 다시 웹 사이트에 접속해 보면 서버로부터 데이터를 제대로 불러오는 것을 확인할 수 있습니다.