팀 프로젝트에 HTTPS 를 적용한 과정과 HTTPS 통신 과정을 정리했다.
먼저 HTTPS 는 두 가지 방법으로 적용해 봤다.
직접 인증서를 발급 받아 Nginx 에서 설정하기
CloudFlare 를 사용해서 HTTPS 적용하기
백엔드 main ec2(public ip: 43.200.175.197)
www.f-12.shop, f-12.shop 으로 접속 가능하다.
sudo apt-get install nginx
cd /etc/nginx/sites-available
sudo vi default
server {
// 연결한 도메인 입력, 이름은 공백으로 구분함
server_name f-12.shop www.f-12.shop;
location / {
// 연결할 서버 주소 입력
proxy_pass http://{ backend main ec2의 private ip };
}
}
파일 수정후 테스트 실행(변경한 파일에 오타가 있으면 테스트를 통과하지 못한다)
sudo nginx -t
nginx 재시작(변경사항 적용)
sudo systemctl restart nginx
certbot(Let’s Encypt 인증서를 자동으로 사용하여 HTTPS를 활성화해주는 무료 오픈 소스 소프트웨어) 사용
certbot 설치하기
sudo snap install certbot --classic
certbot 으로 Let’s Encypt SSL 인증서 발급(https 활성화 설정)
// -d 를 사용해서 한번에 여러개의 도메인을 등록함
// usage: certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...
sudo certbot --nginx -d f-12.shop -d www.f-12.shop
Certbot 이 자동으로 433 포트 설정을 해줌
Certbot 이 http → https 리다이렉션 설정을 해줌
CloudFlare 를 사용하면 자동으로 Universal SSL 인증서가 발급되고 이를 통해서 Https 설정이 가능했다. 기존에 Https를 적용하기 위해서 각 Ec2 마다 Certbot 을 설치해서 인증서를 다운받아 Nginx 에서 Https 를 설정 했지만 CloudFlare 를 사용하면 한 번에 HTTPS 를 적용할 수 있다는 장점이 있었다.
Cloud Flare는 HTTPS 로 요청을 받아서 우리의 AWS EC2 서버의 80번 포트로 패킷을 전달해준다.
HTTPS 는 TCP 위에 SSL/TLS 층을 추가하여 암호화, 인증 그리고 무결성 보장을 통해 더 안전하게 만들어주는 프로토콜이다.
대칭키와 공개키 방식을 전부 사용하는 하이브리드 방식이다. 데이터 전송을 위해 대칭키 방식을 사용하며 대칭키를 안전하게 전달하기 위해 공개키 방식을 사용한다.
먼저 대칭키 방식과 공개키 방식을 알아보자.
대칭키의 경우에는 클라이언트와 서버가 모두 같은 키로 암복호화를 한다. 속도가 빠르다. 하지만 최초에 대칭키를 교환할때 탈취 당하게 되면 암호화 의미가 없어진다. 이를 보완하기 위해서 나온 방법이 공개키 방식이다. 대칭키를 클라이언트에서 공개키로 암호화를 하고 서버에서 개인키로 복호화를 한다. 이런 방식을 공개키 방식이라고 한다. 대칭키에 비해 처리하는 속도가 느리다.
HTTPS 통신을 할때 서버는 SSL 인증서를 클라이언트에 보내줘야 한다. 그렇다면 서버는 어떻게 SSL 인증서를 발급받을 수 있을까?
서버는 도메인을 가져야한다. 도메인 주소와 사이트 정보를 공인인증기관(CA)에 보내면 인증절차를 거친뒤에 안전한 사이트임이 확인되면 CA의 개인키로 암호화된 SSL 인증서를 발급해준다.
HTTPS 통신 과정을 살펴보자. 클라이언트에서 요청을 보내면 HTTPS 는 TCP 기반 프로토콜이기 때문에 3way-handshake 를 한뒤에 SSL handShake 를 진행한다. SSL handShake 과정에서 대칭키를 교환하게 된다.
SSL(Secure Sockets Layer)
암호화 기반 인터넷 보안 프로토콜이다. 암호화된 연결을 생성한다.
TLS(Transport Layer Security)
SSL은 1996년 SSL 3.0 이후 업데이트되지 않았으며, 앞으로 사라지게 될 것으로 여겨지고 있다. 그 대안으로 TLS를 사용한다.
SSL에 기반한 기술로, 국제 인터넷 표준화 기구에서 표준으로 인정받은 프로토콜이다. TCP 443 포트를 사용한다.
TLS 및 SSL는 모두 'SSL'이라고 불리기도 한다.
https://support.google.com/a/answer/100181?hl=ko
https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/