- 회원정보 같은 민감한 정보를 HTTP를 통해 서버로 보낸다고 해보자.
- HTTP는 데이터를 보낼때 암호화하지 않는다. 즉, 중간자 공격같은 보안 취약점을 가질 수 있다는 것이다.
- HTTPS는 SSL/TLS 프로토콜을 사용하여 보안을 제공합니다.
- SSL/TLS 둘 다 암호화 프로토콜이지만 SSL 후속 버전이 TLS이다.
- 즉 SSL의 부족한 점을 보완하기 위해 TLS가 등장하였다.
- SSL은 POODLE 공격에 취약한데, 이는 암호화된 메시지의 일부를 해독할 수 있었습니다.
- SSL은 암호화 키의 길이가 짧은 등의 문제가 있었는데 Brute-Force 공격 등에 취약했습니다.
- SSL에 비해 TLS가 더 많은 암호화 옵션과 알고리즘을 제공한다.
- 클라이언트가 HELLO라는 메시지를 보내며 가용한 알고리즘 목록을 보냅니다.
- 서버가 알고리즘을 정한 후 응답으로 인증서를 보냅니다. 이때 인증서 안에는 서버의 공개키가 포함되어 있습니다.
- 클라이언트가 서버로부터 받은 인증서를 검증한 후, 서버와 통신할 것인지를 판단합니다.
- 클라이언트가 세션키를 발급한 후, 서버의 공개키로 세션키를 암호화하여 서버로 보냅니다.
- 서버는 개인 키로 복호화하여 세션 키를 획득합니다.
- 암호화 알고리즘에는 크게 대칭키 암호화와 비대칭키 암호화가 있습니다.
- 대칭키 암호화는 암호화와 복호화에 동일한 키를 사용합니다.
- 다만 키가 노출되지 않는 보안문제와, 사용자 쌍마다 유일한 키를 가져야하므로 관리에 복잡한 측면이 있습니다.
- 비대칭키는 공개키와 비공개 키를 사용합니다.
- 비공개키는 사용자만 가지고 있어 보안에 좋지만 속도 측면에서 대칭키보다 느린 단점이 있습니다.
- 대칭키 암호화에서 사용되는 일시적인 암호화 키입니다.
- 세션마다 발급되는 키로 세션이 종료되면 더이상 사용할 수 없는 키입니다.
Nginx + HTTPS + DockerCompose 를 통해 배포하는 과정에 대한 코드
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx
- 이때 도메인을 미리 발급
- SSL 인증서가 기본적으로 도메인에 대해 발급되기 때문
sudo certbot certonly --standalone -d yourdomain.com
- 80포트로 와도 443포트로 리다이렉트
- 443포트 설정
upstream blue_backend {
server blue:3000;
}
upstream green_backend {
server green:3000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name IP주소 도메인;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name IP주소 도메인;
ssl_certificate fullchain.pem 경로;
ssl_certificate_key privkey.pem 경로;
location / {
proxy_pass http://blue_backend;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
- 443 포트를 열어줌
- 발급받은 인증 키 Nginx 설정 파일로 마운트해줌
nginx:
container_name: nginx
image:
ports:
- 80:80
- 443:443
depends_on:
- blue
- green
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt