HTTPS

MihyunCho·2021년 5월 27일
1
post-thumbnail

HTTPS

HTTP + Secure
인터넷에서 데이터를 주고 받을수 있는 통신 프로토콜인 http에 secure라는 보안기능이 붙은 것

https는 http 프로토콜 암호화를 통해 보안을 강화하였다.

http 요청은 중간에 누군가 요청을 들여다보면 그대로 내용을 볼 수 있게되고, 중요한 개인정보들이 노출된다.

https 요청은 요청의 내용을 암호화를 시키기 때문에 개인정보 등 유출이 되더라도 key가 없다면 어떤 내용인지 알 수 없다.

https는 인증서, CA, 비대칭 키 암호화 방식을 이용한다.

인증서(Certificate)

데이터를 제공한 서버가 정말 데이터를 보낸 서버인지 인증, 확인하는 용도이다.
또한 인증서의 내용에 서버의 도메인 관련 정보가 있어서 데이터 제공자의 인증을 용이하게 한다.

CA

앞서 말한 인증서를 발급하는 공인된 기관이며, 각 브라우저는 각자 신뢰하는 CA의 정보를 가지고있다.
이 자격이 계속 유지되는것이 아니라 박탈 당할 수도 있다.

비대칭 키 암호화

전혀 다른 키 한쌍으로 암호화 및 복호화를 진행할 수 있다.
다만 어떤 키로 암호화를 진행하면 또 다른 키로 복호화를 해야한다.

A로 암호화를 하면 이와 한쌍인 B로만 복호화 할 수 있다.
https 를 사용하는 서버는 한쌍의 키중에 하나는 클라이언트에 공개하고, 하나는 숨겨둔다.

HTTPS의 통신과정의 각 과정

HTTPS 서버 구현

mkcert라는 프로그램을 이용해서 로컬 환경(내 컴퓨터)에서 신뢰할 수 있는 인증서를 만들 수 있다.

macOS 사용자의 경우, Homebrew를 통해 mkcert를 설치할 수 있다.

$ brew install mkcert

# firefox를 사용할 경우 필요에 따라 설치
$ brew install nss

인증서 생성

먼저 다음 명령어를 통해 로컬을 인증된 발급기관으로 추가한다.

$ mkcert -install

다음은 로컬 환경에 대한 인증서를 만들어야 하는데, localhost로 대표되는 로컬 환경에 대한 인증서를 만들려면 다음 명령어를 입력해야 한다.

$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

옵션으로 추가한 localhost, 127.0.0.1(IPv4), ::1(IPv6)에서 사용할 수 있는 인증서가 완성되어 cert.pem, key.pem 이라는 파일이 생성되었다.
key은 개인키, cert는 공개키이다.
인증서는 공개키, 그리고 인증기관의 서명을 포함하고 있으므로 공개되어도 상관이 없지만, key.pem의 경우 개인 키이므로 git에 커밋하지 않고, 암호처럼 다루어야 한다.

HTTPS 서버 작성


node.js 환경에서 HTTPS 서버를 작성하기 위해서는 https 내장 모듈을 이용할 수 있다.

방금 생성한 인증서 파일들을 HTTPS 서버에 적용해주는 작업이 필요하다.

// node.js https 모듈 이용

const https = require('https');
const fs = require('fs');

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    function (req, res) {
      res.write('Congrats! You made https server now :)');
      res.end();
    }
  )
  .listen(3001);

이제 서버를 실행한 후 https://localhost:3001로 접속하시면 브라우저의 url 창 왼쪽에 자물쇠가 잠겨있는 HTTPS 프로토콜을 이용한다는 것을 알 수 있다.

express.js를 이용해 https 서버를 만들 수도 있다.
만약 express.js 를 사용하는 경우, 다음과 같이 https.createServer의 두번째 파라미터에 들어갈 callback 함수를 Express 미들웨어로 교체하면 된다.

// express.js 이용

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

const app = express();

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    app.use('/', (req, res) => {
      res.send('Congrats! You made https server now :)');
    })
  )
  .listen(3001);
profile
Sic Parvis Magna 🧩

0개의 댓글