Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

develog

HTTPS 를 적용하기 위한 과정과 필요한 도구들 본문

CS

HTTPS 를 적용하기 위한 과정과 필요한 도구들

LineGu 2022. 2. 1. 20:08

당장 HTTPS를 적용하는 것이 급한 사람들에게는 적절치 않은 글이다.

적용만을 원한다면 이 글을 읽으면 된다.

HTTPS를 적용하는 방식은 매우 다양하다.

어떤 것들이 있을지 간단하게 먼저 정리하면 다음과 같다.

  1. AWS 로드밸런서, AWS ACM 사용
  2. AWS 로드밸런서, AWS ACM, Nginx 사용
  3. Let's Encrypt, Nginx 사용
  4. Let's Encrypt, Nodejs 사용

등등

이 외에도 굉장히 다양하다.

각각의 도구들은 각자 하는 역할이 분명하게 다르며, 그 역할을 위해 어떤 도구를 사용할지는 쓰는 사람의 자유다.

선택한 도구에 따라서 다양한 조합이 생길 수 있다.

인터넷의 대부분 글에는 처음부터 끝까지 정형화된 방식으로 HTTPS를 적용하는 것을 다룬 글이 다수다.

이 글은 HTTPS를 구현하기 위해서 어떤 과정들이 필요한지, 그 과정을 수행하기 위한 도구들이 자주 사용되는지를 알아보는 글이다.

이 글을 모두 읽은 후에는 각자의 선호 방식에 따라 HTTPS를 자유롭게 적용할 수 있을 것이다.


우선, 어떤 과정들이 필요한지 알아보고 그 과정을 수행하기 위한 도구들을 정리해보겠다.

HTTPS에 대해서 아직 명확하게 모른다면, 이 글을 먼저 꼭 읽고오자.

1. 도메인 설정

HTTPS 설정을 위해선 도메인이 필수다.

  • 가비아
  • Google domain
  • AWS Rout53

위 세가지가 국내에서 가장 자주 사용되는 도메인 구매처이다.

같은 도메인이더라도 각 서비스별로 가격이 다 다르다. 잘 재고 사야한다.

만약 AWS로 인스턴스를 이용중이라면, AWS Rout53을 이용하는 것이 가장 편하다. (연동이 잘됨)

하지만 다른 곳에서 도메인을 구매하더라도, 네임서버를 이용해서 도메인과 Route53을 연결해준다면 AWS Rout53에서 도메인을 산 것과 같은 장점을 누릴 수 있다.

2. 공개키, 개인키 발급과 CA 인증서 발급

HTTPS를 위해 가장 필요하고 필수적인 과정이다.

무료로는 아래의 세가지 방법이 자주 사용된다. (유료는 필자가 돈이 없어서 해본적이 없다.)

  • Let's Encrypt
  • AWS ACM (Amazon Certificate Manager)
  • Open SSL

어떤 차이가 있으며, 각자의 장단점은 무엇일까?

Let's Encrypt

단지, CA 기업 중 하나이다. SSL 인증서 가격이 비싸서 HTTPS 적용이 느려지다보니, 문제점을 인식해서 무료 보급을 시작한 비영리 단체이다.

특징은 다음과 같다.

  • 인증 유효기간은 90일이지만 자동으로 갱신 설정이 가능하다.
  • Nginx나 아파치같은 웹 서버에 자동으로 맞춰서 설정해주는 것이 가능하다.
  • 인스턴스 단위로 매번 설정해줘야한다.
$sudo certbot --nginx -d example.com -d www.example.com

이 명령어 하나면, 알아서 인증서 발급, nginx 설정까지 뚝딱 해준다.

사용방법이 굉장히 편해서 테스팅용으로 자주 사용된다.

도메인이 정말 내 도메인이 맞는지 검증하는 작업이 필요하다.

이 도메인 인증 과정이 버전별로 까다로운 경우가 있다.

AWS ACM (Amazon Certificate Manager)

  • Route 53, ELB를 통해서 하나의 인증서로 여러 인스턴스에 적용할 수 있다.
  • 도메인 인증이 간편하다.
  • 인증서를 자동 갱신을 해준다.
  • ELB를 꼭 사용해야 한다.

ELB란 로드밸런서로, 특정 요청이 들어왔을때 어떤 인스턴스로 어떻게 보낼 것인지 등을 관리해주는 수문장이라고 생각하면된다.

AWS ACM는 매우 편리하지만 AWS 생태계에서 벗어날 수 없다는 단점이 있다.

하지만 필자는 매번 AWS만 사용하므로 이 방식을 선호한다.

또, Let's Encrypt와는 다르게 하나의 인증서로 여러 인스턴스에 HTTPS를 적용할 수 있다.

ELB도 사실, 하나의 인스턴스인데 이 수문장에서 인증을 다 완료하기 때문에 뒷단에서 하지 않아도 되는 것이다.

Open SSL

사실 Let's Encrypt, AWS ACM와 같이 어깨를 나란히할 친구는 아니다.

이 친구는 단지 SSL인증서를 발급해주는 오픈소스 소프트웨어일 뿐이다.

CA의 역할을 해줄 수 없어 실제로 이 친구만으로 HTTPS를 시도한다면 브라우저에서 위험하다고 경고를 내뱉는다.

이렇게 혼자서 서명한 것을 Self Signed Certificate(SSC)라고 부른다.

3. 발급받은 인증서 관리

요청이 들어오면 클라이언트에게 인증서를 전달하고 대칭키를 공유해야한다.

이런 인증서 관리를 해주는 것들은 뭐가 있을까.

  • AWS 로드밸런서
  • nginx 같은 웹서버
  • nodejs

AWS 로드밸런서

이 친구는 요청이 들어오면 자기가 가지고 있는 인증서를 이용해서 알아서 인증을 진행하고, 클라이언트와 연결을 맺는다.

이는 로드밸런서를 애초에 생성해줄때, AWS ACM와의 연동만 해주면 쉽게 구현이 가능하다.

nginx, apache 같은 웹서버

ca, key, cert 파일들의 경로를 설정해주면 위 과정을 알아서 처리해준다.

server_name www.some.com; (인증서에 적힌 도메인)
ssl_certificate_key /파일경로/sslcert.co.kr_xxxxx.key.pem; (개인키 파일 지정)
ssl_certificate /파일경로/sslcert.co.kr_xxxxx.ca-bundle.pem; 

이런 정보들을 입력해주어야한다.

nodejs

nodejs 자체에서도 https 모듈을 이용해서 인증 과정을 지원해주고 있다.

const express = require('express');
const fs = require('fs');
const path = require('path');
const HTTPS = require('https');

const app = express();


const option = {
    ca: fs.readFileSync('/etc/letsencrypt/live/등록 시킨 도메인 이름/fullchain.pem'),
    key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/등록 시킨 도메인 이름/privkey.pem'), 'utf8').toString(),
    cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/등록 시킨 도메인 이름/cert.pem'), 'utf8').toString(),
};

HTTPS.createServer(option, app).listen(sslport, () => { 
    console.log('연결 성공');
});

이런식으로 letsencrypt에서 받은 인증서와 연동시킬 수 있다.

4. 포트포워딩

우선 포트포워딩이랑 특정 포트를 개방시켜스 그 포트로 들어온 요청을 자기가 원하는대로 지지고 볶는 것을 말한다. (다른 포트로 돌린다던가 어디로 전달한다던가 등등)

사실 필수적인 작업은 아니라고 생각한다.

하지만 이 과정이 없으면, https://example.com:3000 이런식으로 포트번호가 노출되어 사용되게 된다.

또한, HTTP요청을 HTTPS로 돌려주는 것이 가능해져서 포트포워딩을 사용하는 걸 추천한다.

방법으로는 아래 세가지가 있다.

  • AWS 로드밸런싱
  • Nginx, Apache와 같은 웹 서버
  • iptables

AWS 로드밸런싱

리스너와 액션을 설정해줘서 특정 요청이 들어왔을 때, 어떤 역할을 해야하는지 다 정해줄 수 있다.

예를 들어, 80포트로 요청이 들어오면 Https요청인 443포트로 리다렉트 시키고 443포트로 요청이 들어오면 SSL 인증 후 특정 인스턴스로 전달 시켜주도록 설정할 수 있다.

이 때, 만약 8080포트가 실제 내 노드 서버가 돌아가는 포트라면, 로드밸런서에서 바로 8080포트로 전달시킬 수도 있고, 그냥 80요청으로 인스턴스로 전달시켜 웹 서버에서 8080으로 돌릴 수도 있다.

AWS ACM를 사용한다면 반드시 필요하다.

Nginx, Apache와 같은 웹 서버

웹서버로 인스턴스 내에서 내 노드 서버보다 앞단에 위치한 서버이다. 이 친구도 수문장이라고 생각하면 된다.

80포트로 들어왔을 때, 8080으로 돌려주거나, SSL 인증을 도와주거나 등등 여러 역할을 할 수 있다.

location / {
    return 301 https://127.0.0.1:8080
}

이런식이면 뚝딱 포트포워딩이 가능하다.

iptables

$sudo iptables -t nat -I PREROUTING -p tcp -d 111.222.1.1 --dport 80 -j DNAT --to-destination 111.222.1.1:8080

이런식으로 인스턴스 내에서 직접 포트포워딩이 가능하다.

80포트로 들어온 요청을 8080으로 돌리도록 설정해주는 것이다.


HTTPS를 구현하는데는 위 4가지 과정이 필요하다.

위 과정들에서 각각 원하는 도구들을 선택하여 HTTPS를 적용하면 된다.

내가 선택한 HTTPS 적용 방식에 대해선 다음 포스팅에서 다루겠다.

'CS' 카테고리의 다른 글

HTTPS 란?  (0) 2022.02.01
HTTP Method 정리  (0) 2022.01.29
HTTP/0.9부터 HTTP/3까지. QUIC란?  (0) 2022.01.28
Stateful vs Stateless (HTTP) 에 대해서 알아보자  (2) 2022.01.22
HTTP란?  (0) 2022.01.22
Comments