Explanation
'아마존 웹 서비스'에서는 'Certificate Manager'라는 서비스를 통해서 무료로 인증서를 제공합니다. 우리는 여기에서 인증서를 발급 받아 https통신을 사용할 수 있습니다. 하지만 EC2에 바로 연결해서 사용할 수는 없는 것 같고, 엘라스틱 로드 벨런싱(이하 ELB) 또는 아마존 클라우드 프론트(이하 ACF) 서비스에 EC2를 연결하여 사용할 수 있습니다. ACF에서는 HTTP의 접근을 HTTPS로 리다이렉트 시키는 설정이 있어서 간편하게 설정할 수 있지만 ELB의 경우에는 그런 선택지가 없어서, HTTP의 접근을 HTTPS로 리다이렉트 시키는 웹 서버의 호스트 설정에 대해 적어보려 합니다.
1. ELB -> (ACM ->) EC2
웹사이트의 경우 사용자는 HTTP또는 HTTPS를 통해서 ELB으로 접근을 합니다. 그리고 ELB는 HTTP로 EC2에 접근하여 브라우저에 컨텐츠를 출력합니다. 여기에서 내부적으로는 HTTP로 통신이 이루어지기에 보안에 허술한 것이 아닌지 생각될 수 있지만, AWS의 VPC내에서만 통신이 이루어지기 때문에 보안적으로 안전하다고 합니다.
http://cheolguso.com -> ELB port:80 -> EC2 port:80
https://cheolguso.com -> ELB port:443 -> EC2 port:80
2. nginx 가상 호스트 설정
HTTP로 접근시 HTTPS로 리다이렉트 시키기 위해서는 HTTP와 HTTPS로의 접근의 차이를 알아야 하는데 기본적으로 둘은 같은 port로 접근하기 때문에 그 차이를 알 수가 없습니다. 그렇기에 AWS에서는 $http_x_forwarded_proto라는 값으로 이 통신이 HTTP로 접근했는지 HTTPS로 접근했는지 알려줍니다.
server {
server_name cheolguso.com
...
location / {
if ($http_x_forwarded_proto != "https") {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
...
}
}
3. apache 가상 호스트 설정
<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>
참고링크.
https://www.allcloud.io/how-to-force-https-behind-aws-elb/
http://scottwb.com/blog/2013/10/28/always-on-https-with-nginx-behind-an-elb/
위 참고링크를 확인하시면 보다 자세한 정보를 알 수 있습니다.



