1. CORS(Cross-Origin Resouce Sharing)
- 브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한하는데 그래서 cross-orign 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브러우저에서 요청을 허락하고, 동의하지 않으면 브라우저에서 거절
- 이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데 이것을 CORS라한다.
- Cross-origin 이란 다음 중 한가지라도 다른 경우를 말한다.
- 프로토콜 : http와 https는 프로토콜이 다르다.
- 도메인 : domain.com 과 other-domain.com 은 다르다.
- 포트번호 : 8080포트와 3000 포트는 다르다.
1) CORS의 필요성
- CORS가 없는 모든 곳에서 데이터 요청이 가능하면 보안성이 떨어진다.
- 기존사이트와 동일하게 작동하게 하여 사용자의 세션을 탈취 가능
- 브라우저를 보호하고 필요한 경우에만 서버와 협의하여 요청 할 수 있도록 하기 위해서 필요
2. CORS 동작
1) Simple requests 경우
- 이 요청은 추가적으로 확인하지 않고 바로 본 요청을 보낸다.
- HTTP method가 다음중 하나이면서
- GET
- HEAD
- POST
- 자동으로 설정되는 헤더를 제외하고, 설정할 수 있는 다음헤더들만 변경하면서
- Accept
- Accept-Language
- Content-Language
- Content-Type이 다음과 같은 경우
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
2) preflight요청일 경우
- Simple Request가 아닌 모든 요청은 모두 preflight요청을 한다.
- 실제 요청을 보내는 것이 안전한지 확인하기 위해 OPTIONS 메서드를 사용하여 cross-oring HTTP요청을 보낸다.
- 사용자 데이터에 영향을 미칠 수 있는 요청이므로 사전에 확인 후 본 요청을 보내는 것이다.
2. EC2서버 HTTPS 적용시키기
- 준비물 : 도메인(나는 가비에 에서 550원에 하나 구매), 열어놓은 EC2 인스턴스
1) EC2 보안 규칙 설정
- 위와 같이 보안 규칙을 설정해준다
- 3306은 RDS를 사용하지 않으면 제외해도 된다
2)Route 53 설정
- 구매한 도메인 이름만 작성하고 퍼블릭 호스팅 영역을 선택해 준다.
- 유형의 NS에 있는 값/트래픽 라우팅 대상 4개를 기억해 두자.
- A 유형과 CNAME은 나중 단계에 추가하닌까 지금은 신경 꺼두자
3)가비아 네임서버 설정
- 가비아 도메인관리 페이지에서 해당 도메인의 네임서버 설정을 바꿔줘야 한다.
- 위와 같이 앞서 기억해준 NS유형의 값/트래픽 라우팅 대상 4개를 잘 붙여넣어준다.
- Route53에서의 값과 다르게 뒤에 점(.) 하나는 빼자
- 소유자 인증을 하고 적용하자
4)ACM(AWS Certificate Manager)가서 SSL인증서 요청
ㄱ. 인증서 요청하기
- 해당 페이지에서 인증서 요청 클릭
- 위와 같이 작성해 준다. 도메인 이름과 DNS검증, 태그는 생략한다.
ㄴ. 레코드 생성하기
- 이거는 발급이 이미 완료됐지만, 발급 요청중 또는 대기중으로 뜰 것이다.
- 침착하게 <Route 53에서 레코드 생성>을 누르자
- 이미 전에 생성해서 안되지만 처음할 때는 CNAME 레코드를 생성해주면 된다.
- 위에 값들은 아마 자동으로 다 적혀있을 것이다.
5)다시 Route 53에서 레코드를 넣어준다.
- 만들어 준 호스팅 영역으로 들어간다.
- 현재 2개의 레코드가 있을 것이다.(NS와 SOA)
- 이제 CNAME형태의 레코드를 생성해보자
- 앞서 ACM에서 생성한 인증서의 도메인을 보면 CNAME의 이름과 값을 쉽게 복사할 수 있다.
- 이름 : 언더바(_)부터 나의 도메인 .sparta-prac-lhb.shop 이전까지 잘 넣어주자
- 값은 언더바부터 점(.)까지 알뜰하게 다 넣어주면 된다.
- 레코드를 생성하면 된다.
6)가비아에서 DNS설정 해주기
- 위와 같이 도메인 연결을 들어가 준다.
- 원래 만들어져있던 건지, 아니면 만들어 줬던 건지 기억이 안나지만 아무튼 알아서 아래와 같이 설정해주자.
- 여기도 CNAME의 이름과 값을 위와같이 넣어주면 된다. 특히 호스트에서 마지막에 점(.)까지 넣어준 것을 확인하자.
- 뺴도 되나 모르겠지만 넣어을 때 됐으니 넣어준다.
- 타입 : CNAME
- 호스트 : 레코드 이름
- 값/위치 : 값/트래픽 라우팅 대상
7)EC2 가서 로드 밸런싱 대상 그룹 만들어주기
- 대상 그룹(target group)을 들어간다.
- 위와 같이 설정해준다. 그룹이름만 지어주지 거의 그대로 진행하면 될 것 이다.
- 현재 사용중인 인스턴스를 체크한 후 포트 80과 443포트를 <아래에 보류 중인 것으로 포함>으로 추가해준다.
- 혹시 몰라서 8080도 추가해줬긴 했었다.
- 그리고 대상 그룹 생성을 진행
8)로드 밸런서 생성하기
- 앞서 EC2에서 로드밸런싱 탭에서 로드밸런서를 눌러주고 로드 밸런서를 생성해주자.
- 사진은 완성된 이후 모습니다.
- Application Load Balancer( 가장 좌측) 을 생성해준다.
- 기본 구성은 이름만 지어주면 될 것 이다. 나머지는 안건들여도 된다.
- 네트워크 매핑은 a와 c를 선택해준다. 어디서는 4개 다 선택해도 상관없다고 하는데 잘 모르겠다. 난 a,c 2개 했다.
- 보안 그룹은 default는 놔두고 ec2의 보안그룹과 같은 종류를 추가해준다.
- 나는 launch-wizard-6였다.
- 리스너는 위와 같이 HTTP 80포트와 HTTPS 433포트를 추가해준다. 둘다 대상그룹은 좀전에 만들어 준 것을 선택해주면 된다.
- 나는 이미 만들고 적용해서 적용이 안되는 모습니다.
- 보안 리스너는 인증서만 받아와주면 된다. 안보인다면 오른쪽 새로고침 버튼을 눌러보자.
- 없다면 ACM에서 인증서 상태를 확인해보자.
- 인증서 생성에 5~30분 늦으면 1시간 걸린다고는 하나, 거의 만들고 있는 본인이 무언가 놓쳤을 확률이 높다.
- 인증서까지 받았다면 <로드밸런서 생성>을 눌러서 생성을 완료하자.
9)로드 밸랜서 리스너 편집하기
- 우선 HTTP:80 리스너 부터 편집해주자.
- HTTP 80으로 들어오는 것을 HTTPS 443 으로 리디렉션 시켜주자.
- 전달, 리디렉션, 고정 응답 변환 옵션 이 있는데 리디렉션으로 바꿔주면 위와 같이 설정창이 바뀔 것이다.
10)Route 53 에서 A 레코드 추가
- 다시 Route 53으로 와서 아까만든 호스팅영역에서 레코드를 생성해주자.
- 이번에는 A 유형의 레코드를 추가하고 값에 인스턴스 퍼블릭 IP를 넣어준다.
- 별칭을 열어주고 위와 같이 설정해준다
- Application/Classic Load Balancer
- ap-notheast-2
- 아까 생성한 로드 밸런서
11)설정 완료
- 위 과정들을 통해 모든 설정이 완료되었다.
- 바로 요청하면 502에러가 뜰 것이지만 시간이 지나면 HTTPS 적용이 완료된 것을 확인할 수 있을 것이다.
3. 참조자료
1) CORS란? : https://hannut91.github.io/blogs/infra/cors
2)EC2 HTTPS 적용하기 : https://pgmjun.tistory.com/69