Skip to content

HTTP에서 HTTPS로 배포하기

Park Hyeon Ki(Mocha) edited this page Dec 13, 2022 · 2 revisions

SSL이란?

SSL(SecureSocketsLayer)은 통신 암호화입니다. SSL을 이용하지 않는 경우, 통신 정보가 열람될 가능성이 있다. SSL을 사용하면 데이터 통신을 암호화 하기 때문에, 데이터를 도청 당해도 해독할 수 없다. 암호화에는 ‘공통키 암호 방식’과 ‘공개키 암호 방식’ 두 가지가 있다. SSL은 이 2개의 암호 방식을 조합하는 것으로 안전하고 빠른 통신을 실현한다.

'공통키 암호 방식'은 브라우저(클라이언트)와 서버가 각각 공통키를 갖고 암호화 된 통신을 하는 것인데, 공통키를 서로 갖기 위한 통신은 암호화되어 있지 않다. 하지만 심플한 만큼 처리속도가 빠른 것이 특징이다.

'공개키 암호 방식'은 공개키와 개인키가 세트이며, 공개키로 암호화 한 경우에는 개인키로 복호화해야 한다. 반대의 패턴도 있어, 개인키로 암호화 한 경우는 공개키가 필요한 상태이다. 이 경우 서버가 공용키만을 브라우저(클라이언트)로 보내고 브라우저(클라이언트)가 암호화를 수행했다고 해도 개인 키를 가지고 있는 서버는 복합이 가능한 구조입니다. 공통키 암호 방식의 리스크가 줄어들지만 처리 속도가 느리다는 것이 단점이다.

브라우저가 SSL 통신을 요청하면 서버에서 SSL 서버 증명서와 공통키가 발송된다. 이 정보를 받은 브라우저(클라이언트 측)는 증명서를 조회하여 인증을 마치면 공통키를 암호화하여 서버에 보낸다. 서버는 비밀키로 공개키를 복호화하고 공통키를 브라우저(클라이언트)와 서버 양쪽이 가진 상태에서 안전한 통신을 실시하는 것이다.


장점

1. 리스크를 줄일 수 있다.

SSL 도입으로 데이터의 도청등의 피해를 방지할 수 있다.

2. 사용자로부터의 신뢰성이 향상된다.

SSL 대응이 끝난 홈페이지는 사용자가 안심하고 열람할 수 있다.

3. SEO에 좋은 영향을 준다.

구글에서는 https화(SSL화)를 하고 있는지를 검색 순위의 결정 요소에 포함한다고 발표하고 있다. 키워드의 최적화 등 다른 부분에서 SEO에 힘쓰고 있다면 반드시 해야 할 SEO 대응항목 중 하나이다.

단점

1. 비용이 든다.

SSL을 도입하기 위한 작업 비용과 SSL서버 증명서의 취득 비용이 발생합니다.(현재는 무료로도 가능하다)

2. 작업 시간이 발생한다.

SSL의 이용 계약은 물론, 작업으로서도 Search Console(서치콘솔)의 신규 속성 등록이나 Google 애널리틱스 설정 변경, 링크의 확인이나 리다이렉트 설정 등 실행해야 할 것이 많다. 작업뿐만 아니라 확인에도 많은 시간이 소요된다.

SEO에 미치는 영향


2014년 8월 구글이 SSL화를 검색 순위 결정에 포함한다고 발표한 바 있다. SSL화를 하지 않는 것이 SEO에 영향을 미치는 것은 확실하지만 항상 사이트의 경합 상황 등 검색순위는 항상 변동하기 때문에 단순히 SSL화만이 검색순위에 구체적으로 어떻게 영향을 미치고 있는지는 모른다.그러나, SSL화가 검색 순위 평가기준에 영향을 미친다라는 것을 알고 있는 이상, SSL화는 필수항목 중 하나이다. 유저에게 있어서도 안전하게 사이트를 이용할 수 있으며, 마케팅에 대해서도 계속적인 이점을 얻을 수 있다.

Https를 Knoticle에 적용하기


Https로 변경하는 것이 SEO에 미치는 영향을 알게 되었고, 보안적으로도 중요하다고 판단해 Knoticle 프로젝트에 적용하기로 결정했다.

Nginx 리버스 프록시 설정

리버스 프록시를 위한 Nginx 설정을 해준다.

배포 서버로 ssh 접속 후 /etc/nginx/sites-available의 파일을 수정해준다.

server {
	listen 80 default_server;
	listen [::]:80 default_server;

	root /var/www/html;

	index index.html index.htm index.nginx-debian.html;

	server_name knoticle.app;

	location / {
				proxy_pass http://27.96.130.68/;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
		
		try_files $uri $uri/ =404;
	}

Certbot 설치 및 Let’s Encrypt에서 SSL 인증서 발급

Certbot은 쉽게 SSL 인증서를 자동 발급할 수 있도록 도와주는 도구이다.

Let’s Encrypt는 SSL 인증 기관이다.

$ sudo snap install certbot --classic

하기 명령을 통해 SSL 인증서를 발급 받자

$ sudo certbot --nginx

이메일 입력 후 이용약관 동의하고 사용할 도메인을 입력한다. 이때, 적용할 도메인에 대한 A 레코드가 반드시 적용되어 있어야 한다.

이 과정을 통해 Certbot은 Let’s Encrypt를 통해 자동으로 SSL 인증서를 발급해온다.

worker_processes auto;
  
events {
  worker_connections 1024;
}

http {
  upstream frontend {
    server localhost:3000;
  }

  upstream backend {
    server localhost:8000;
  }

  server {
    server_name www.knoticle.app;

    location /api {
      proxy_pass http://backend;
    }

    location / {
      proxy_pass http://frontend;
    }
  
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.knoticle.app/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.knoticle.app/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

  server {
    if ($host = www.knoticle.app) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name www.knoticle.app;
    return 404; # managed by Certbot

}}

https 적용하기 완료!

Reference

Clone this wiki locally