왜 HTTPS를 해야할까

JSM·2023년 11월 20일
0

프로젝트

목록 보기
5/10
post-thumbnail

왜 HTTPS를 해야할까?

  • 회원정보 같은 민감한 정보를 HTTP를 통해 서버로 보낸다고 해보자.
  • HTTP는 데이터를 보낼때 암호화하지 않는다. 즉, 중간자 공격같은 보안 취약점을 가질 수 있다는 것이다.

SSL/TLS 통신이 무엇일까?

  • HTTPS는 SSL/TLS 프로토콜을 사용하여 보안을 제공합니다.
  • SSL/TLS 둘 다 암호화 프로토콜이지만 SSL 후속 버전이 TLS이다.
  • 즉 SSL의 부족한 점을 보완하기 위해 TLS가 등장하였다.

TLS는 어떤 점이 보완 되었을까?

  • SSL은 POODLE 공격에 취약한데, 이는 암호화된 메시지의 일부를 해독할 수 있었습니다.
  • SSL은 암호화 키의 길이가 짧은 등의 문제가 있었는데 Brute-Force 공격 등에 취약했습니다.
  • SSL에 비해 TLS가 더 많은 암호화 옵션과 알고리즘을 제공한다.

HTTPS는 어떻게 통신할까?

  1. 클라이언트가 HELLO라는 메시지를 보내며 가용한 알고리즘 목록을 보냅니다.
  2. 서버가 알고리즘을 정한 후 응답으로 인증서를 보냅니다. 이때 인증서 안에는 서버의 공개키가 포함되어 있습니다.
  3. 클라이언트가 서버로부터 받은 인증서를 검증한 후, 서버와 통신할 것인지를 판단합니다.
  4. 클라이언트가 세션키를 발급한 후, 서버의 공개키로 세션키를 암호화하여 서버로 보냅니다.
  5. 서버는 개인 키로 복호화하여 세션 키를 획득합니다.

암호화 알고리즘이 뭘까?

  • 암호화 알고리즘에는 크게 대칭키 암호화와 비대칭키 암호화가 있습니다.
  • 대칭키 암호화는 암호화와 복호화에 동일한 키를 사용합니다.
  • 다만 키가 노출되지 않는 보안문제와, 사용자 쌍마다 유일한 키를 가져야하므로 관리에 복잡한 측면이 있습니다.
  • 비대칭키는 공개키와 비공개 키를 사용합니다.
  • 비공개키는 사용자만 가지고 있어 보안에 좋지만 속도 측면에서 대칭키보다 느린 단점이 있습니다.

세션 키가 뭘까?

  • 대칭키 암호화에서 사용되는 일시적인 암호화 키입니다.
  • 세션마다 발급되는 키로 세션이 종료되면 더이상 사용할 수 없는 키입니다.

Let's Encrypt를 통해 HTTPS TLS 통신 구현하기

Nginx + HTTPS + DockerCompose 를 통해 배포하는 과정에 대한 코드

1. CERBOT 설치

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

2. 인증서 발급

  • 이때 도메인을 미리 발급
  • SSL 인증서가 기본적으로 도메인에 대해 발급되기 때문
sudo certbot certonly --standalone -d yourdomain.com

3. Nginx 설정 업데이트

  • 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";
    }
}

4. 컴포즈 파일 업데이트

  • 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
profile
내 기술적 고민들을 모은 곳...

0개의 댓글