개념학습

HTTPS란

Heemok 2023. 6. 29. 16:46

2023-06-29(목)

 

Chapter4. HTTPS

  • 왜 HTTPS가 HTTP보다 안전한 지 이해한다.
  • HTTPS의 암호화 방식에 대해 이해한다.
  • HTTPS에서 사용하는 대칭키, 비대칭키 방식에 대해 이해한다.
  • 직접 로컬에서 HTTPS 인증서를 발급할 수 있다.

왜 HTTPS가 HTTP보다 안전한 지 이해한다.

= > HTTPS가 HTTP와 달리 요청과 응답으로 오가는 내용을 암호화하기 때문입니다.

 

아래 이미지는 HTTP로 보낸 요청을 'wireshark'라는 패킷 분석 프로그램을 이용하여 캡처한 것입니다. 이미지를 확인해 보면, email과 password 같은 값을 그대로 볼 수 있는 것을 알 수 있습니다. 이는 제3자가 HTTP 요청 및 응답을 탈취한다면 전달되는 데이터의 내용을 그대로 확인할 수 있다는 뜻이기도 합니다.

 

아래는 위 이미지와 동일한 요청을 HTTPS 프로토콜로 보냈을 때를 확인한 것입니다. 똑같은 요청임에도 데이터가 암호화되었음을 알 수 있습니다. 따라서 HTTPS 요청 및 응답은 중간에 제3자에게 데이터가 탈취되더라도 그 내용을 알아볼 수 없습니다.


HTTPS의 암호화 방식에 대해 이해한다.

데이터를 암호화를 할 때에는 암호화할 때 사용할 키, 암호화한 것을 해석(복호화)할 때 사용할 키가 필요합니다. 이때 암호화와 복호화할 때 사용하는 키가 동일하다면 대칭 키 암호화 방식, 다르다면 공개 키(비대칭 키) 암호화 방식이라고 합니다.


HTTPS에서 사용하는 대칭키, 비대칭키 방식에 대해 이해한다.

1. 대칭 키 암호화 방식

대칭 키 암호화 방식은 하나의 키만 사용합니다. 암호화할 때 사용한 키로만 복호화가 가능합니다.

두 개의 키를 사용해야 하는 공개 키 방식에 비해서 연산 속도가 빠르다는 장점이 있습니다. 하지만 키를 주고받는 과정에서 탈취당했을 경우에는 암호화가 소용없어지기 때문에 키를 관리하는데 신경을 많이 써야 합니다.

 

2. 공개 키(비대칭 키) 암호화 방식

비대칭 키 암호화 방식은 두 개의 키를 사용합니다. 암호화할 때 사용한 키와 다른 키로만 복호화가 가능합니다.

여기서 두 개의 키를 각각 공개 키, 비밀 키라고 부릅니다. 여기서 공개 키는 이름 그대로 공개되어 있기 때문에 누구든지 접근 가능합니다. 누구든 이 공개 키를 사용해서 암호화한 데이터를 보내면, 비밀 키를 가진 사람만 그 내용을 복호화할 수 있습니다. 보통 요청을 보내는 사용자가 공개 키를, 요청을 받는 서버가 비밀 키를 가집니다. 이때, 비밀 키는 서버가 해킹당하는 게 아닌 이상 탈취되지 않습니다.

 

이러한 공개 키 방식은 공개 키를 사용해 암호화한 데이터가 탈취당한다고 하더라도, 비밀 키가 없다면 복호화할 수 없으므로 대칭 키 방식보다 보안성이 더 좋습니다. 하지만 대칭 키 방식 보다 더 복잡한 연산이 필요하여 더 많은 시간을 소모한다는 단점이 있습니다.

 


직접 로컬에서 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);

express.js 이용

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

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);