작업 환경
IDE: IntelliJ
Spring Boot: 3.2.3
Java: 20
Spring Boot로 서버를 구축하고 AWS EC2를 사용하여 서버를 구축할 때, 클라이언트와 통신을 위하여 Https를 적용해야 하는 경우가 있습니다.
제 프로젝트 환경에서 프론트 팀원분은 React를 사용하여 클라이언트를 구축합니다.
그럼 제가 구축한 서버와 클라이언트가 통신 시 높은 확률로 CORS(Cross-Origin Resource Sharing) 오류가 발생하게 됩니다.
CORS(Cross-Origin Resource Sharing) 오류를 피하기 위해 EC2에 Https를 적용하는 방법을 알아보겠습니다.
먼저 CORS(Cross-Origin Resource Sharing) 오류에 대해 간단히 짚고 넘어가겠습니다.
CORS(Cross-Origin Resource Sharing) 오류는 웹 애플리케이션에서 발생하는 보안 메커니즘 관련 문제로, 다른 Origin에서 호스팅되는 리소스에 대한 접근이 시도 될 때 발생합니다.
Origin은 다음과 같은 구성을 가지고 있습니다
Origin:
Protocal | Hostname | Port |
---|---|---|
https:// | example.com | :8080 |
위 3가지 구성 요소 중 하나라도 다를 경우 CORS 오류가 발생하게 됩니다.
기본적으로 Spring Boot 프로젝트로 서버를 생성할 경우 Https 설정이 되어 있지 않기 때문에 클라이언트와 통신 시 CORS 오류가 발생 할 수 있습니다.
CORS 오류를 해결하는 방법은 다음과 같습니다.
Origin 통일
가장 근본적인 해결책입니다. Protocal, Hostname, Port를 통일시켜 CORS 문제를 방지하는 것 입니다.
서버측 CORS 헤더 추가
이 방법은서버가 'Access-Control-Allow-Origin' 과 같은 CORS 관련 Http 헤더를 포함하도록 구성하는 것입니다.
프록시 서버 사용
클라이언트와 버서 사이에 프록시 서버를 배치하여 모든 요청을 중계하는 방법입니다. 이 방법으로 CORS 오류를 우회 할 수 있습니다
JSONP(JSON with Padding)
이 방법은 오래된 웹에서 사용되며, 스크립트 태그를 통해 다른 출처의 리소스를 불러올 수 있도록 합니다. 그러나 보안상 취약점이 있기에 권장되지 않는 방법입니다.
먼저 EC2에 Https를 적용하는 과정을 간단히 요약하자면,
1. NS(Name Server)를 적용시킬 수 있는 Domain 구하기
2. Route 53에 Domain 적용 후 NS 등록
3. AWS Certificate Manager(ACM)으로 SSL 인증서 발급
4. 로드 밸런서를 사용하여 Https 적용
저는 Domain을 구할 때 가비아(https://www.gabia.com)를 주로 이용합니다.
저렴한 가격으로(도메인 마다 가격이 상이하지만 .shop 도메인으로 구매하시면 1년동안 500원에 이용하실 수 있습니다) 편하게 Domain을 구하실 수 있습니다. 해당 게시글은 가비아를 사용하여 진행하였습니다.
먼저 가비아에 접속하여 회원가입을 진행해 줍니다.
그 다음 메인 뷰 중간에 자신이 원하는 Domain을 적고 검색해줍니다.
다양한 Domain이 보여지는데 이 중 가장 저렴한 .shop Domain을 선택하여 결제를 진행하시면 됩니다.
구매가 완료되시면 우측 상단에 My가비아 - 서비스 관리로 이동하시면 구매하신 Domain을 확인 할 수 있습니다.
이제 Route 53에 구매한 Domain을 적용하고 NS를 등록해야합니다.
AWS 상단 검색에 Route 53을 검색하여 들어가줍니다.
호스팅 영역 - 호스팅 영역 생성으로 이동합니다.
저는 이미 호스팅 영역을 생성하여 아래와 같이 호스팅 영역이 하나 존재하고 있습니다.
도메인 이름에 example.com과 같이 가비아에서 구매한 Domain을 작성해줍니다.
그 외 설명과 유형, 태그는 그대로 두고 호스팅 영역 생성을 눌러줍니다.
Route 53 생성이 완료되었습니다. NS를 보시면 4개의 ns- 가 존재하는 걸 확인할 수 있습니다.
이제 NS를 가비아에 접속하셔서 My가비아 - 서비스 관리에 들어가시고 구매하신 Domain 우측의 관리에 들어가줍니다.
네임서버 설정에 들어가셔서 1차 ~ 4차에 Route 53에 있던 NS를 입력해줍니다.
이 때 뒤에 . 은 제외하고 입력해주세요.
상단 검색에 Certificate Manager를 검색하시고 들어가주세요.
왼쪽 메뉴의 인증서 요청이나 오른쪽 상단의 요청으로 들어가줍니다.
퍼블릭 인증서 요청으로 설정하고 다음으로 가주세요.
완전히 정규화된 도메인 이름에 Route 53에 작성하신 Domain을 입력하시면 됩니다.
검증 방법은 default인 DNS 검증으로 선택하고, 키 알고리즘도 RSA 2048로 선택하시면 됩니다.
그 외 태그는 따로 작성하지 않고 요청을 하시면 됩니다.
이제 요청하신 인증서에 들어가셔서 도메인 부분의 Route 53에서 레코드 생성을 클릭합니다.
검색 아래의 모든 태그를 삭제하시면 아까 Route 53에서 생성한 호스팅 영역이 보입니다.
해당 호스팅 영역을 선택하고 레코드 생성을 눌러주세요.
시간이 지나면 상태가 검증 대기중에서 발급됨으로 바뀝니다.
EC2에 들어가시면 우측 하단에 로드 밸런서가 있습니다. 그리고 로그 밸런서 생성을 클립합니다.
저희는 Https 적용을 하기 위해 Application Load Balancer을 생성해 줍시다.
로드 밸런서의 이름을 작성해 줍니다.
체계와 IP 주소 유형은 default로 설정합니다.
네트워크 매핑에서 연결한 VPC를 선택해줍니다.
여기서 주의하셔야 할 부분은 가용 영역을 최소 2개 이상 선택하여야 합니다.
저는 ap-northeast-2a, ap-northeast-2c를 선택해주었습니다.
보안 그룹은 최대 5개까지 설정 가능합니다.
선택하신 보안 그룹에는 Http 80 포트와 Https 443 포트가 꼭❗설정되어 있어야 합니다.
만약 Http 80 포트와 Https 443 포트가 설정되어 있지 않으면 보안 그룹에서 추가하시고 선택해주세요.
이제 리스너 및 라우팅에서 HTTP:80과 HTTPS:443 리스너를 생성해야 합니다.
리스너 태그 추가로 HTTPS:443을 추가해줍시다.
그리고 대상 그룹을 생성해야 합니다.
기본 구성은 인스턴스로 설정해줍니다.
대상 그룹 이름은 원하시는 이름으로 작성하시면 됩니다.
그리고 프로토콜 : 포트 부분은 HTTP로 해주시고 포트 번호는 80으로 설정해주세요.
나머지 설정은 default 그대로 설정하시면 됩니다.
다음을 누르고 대상 그룹을 적용시킬 EC2 인스턴스를 선택하고 아래에 보유 중인 것으로 포함을 눌러줍니다.
이제 아래의 대상 그룹 생성을 클릭하시면 생성이 완료됩니다.
다시 로드 밸런서 생성으로 돌아오셔서 오른쪽의 새로고침을 눌러주시면 방금 생성한 대상 그룹이 나옵니다.
이 대상 그룹을 HTTP:80과 HTTPS:443에 적용시켜주세요.
보안 리스너 설정에서 인증서 부분에 아까 AWS Certificate Manager에서 발급한 SSL 인증서를 선택해줍니다.
나머지 설정은 default로 선택하시고 로드 밸런서 생성을 눌러주시면 다음과 같이 로드 밸런서 생성이 완료됩니다.
마지막으로 Route 53에 들어가셔서 호스팅 영역 - 레코드 생성을 클릭합니다.
레코드 이름은 선택 사항입니다.
별칭을 체크해주시고 Application/Classic Load Balancer에 대한 별칭을 선택해주세요.
리전은 아시아 태평양(서울) 그리고 로드 밸런서는 방금 만드신 로드 밸런서를 선택하시고 레코드 생성을 눌러주시면 됩니다.
좋은 글 감사합니다! 그런데 질문이 있습니다.
해당 사항을 따라해보고 구입한 도메인에 접속을 해보니 502 에러가 뜹니다. 혹시 어디가 잘못되었는지 아십니까?