[네트워크] HTTPS

LMH·2023년 1월 4일
0
post-thumbnail

이번 포스팅에서는 HTTPS에 대해서 정리하겠습니다.

HTTPS는 HTTP Secure의 약자로, 단어 뜻 그대로 기존의 HTTP 프로토콜을 더 안전하게(Secure) 사용할 수 있음을 의미합니다.

HHTP 요청과 응답 과정에서 누군가가 요청이나 응답을 탈취하면 전달되는 데이터가 노출될 수 있습니다. 그 데이터가 로그인에 관한 정보 또는 중요한 개인정보라면 사용자는 정신적, 재산적 피해를 입게될 수 있습니다.

HTTPS를 사용하면 전달되는 데이터를 암호화하여 전달할 수 있습니다.

암호화 방식

대칭 키

대칭키는 함호화 할 때 사용하는 키가 하나이며, 이 키를 이용해서 데이터를 암호화하고 복화하할 수 있습니다.

두 개의 키를 사용해야하는 공개 키 방식에 비해서 연산 속도가 빠르다는 장점이 있습니다. 하지만 키를 주고 받는 과정에서 탈취 당했을 경우에는 데이터가 그대로 노출될 위험이 있습니다.

비대칭 키(공개 키, 암호 키)

공개 키와 암호 키로 구분되며 공개 키는 누구나 접근이 가능합니다. 누구든 이 공개 키로 암호한 데이터를 보내면 비밀 키를 가진 사람이 암호 키를 이용하여 암호화된 데이터를 복호화할 수 있습니다.

대칭 키와 비교해서 보안성은 우수하지만 암호화에 복잡한 연산을 필요로하기 때문에 더 많은 시간이 소모한다는 단점이 있습니다.

SSL/TLS 프로토콜

HTTPS는 SSL(보안 소켓 계층, Secure Sokets Layer)은 TLS(전송 계층 보안, Transport Layer Security) 또는 TLS(전송 계층 보안, Transport Layer Security) 프로토콜을 이용하여 서버 인증 및 데이터 함호화를 진행합니다.

SSL이 표준화된 것으로 사실상 같은 프로토콜이라 할 수 있습니다.

HTTPS 암호화 특징

  • CA를 통한 인증서를 사용합니다.
  • 대칭 키, 공개 키 암호화 방식을 모두 사용합니다.

인증서와 CA(Certificate Authority)

HTTPS를 사용하면 브라우저가 서버의 응답과 함께 전달된 인증서를 확인할 수 있습니다. 이러한 인증서는 서버의 신원을 보증해줍니다. 이때 인증서를 발급해주는 공인된 기관들을 Certificate Authority, CA라고 부릅니다.

HTTPS의 암호화, 복호화 과정

HTTPS가 데이터를 암호화하는 과정은 다음과 같습니다.

1. 서버는 CA에 서버의 정보와 공개키를 전달합니다.

2. CA는 비밀 키를 이용하여 서버의 정보와 공개키를 암호화한 인증서를 서버에게 전달합니다.

3. 서버는 클라이언트에게 요청을 받으면 CA에게 받은 인증서를 클라이언트에게 보냅니다.

4. 클라이언트(브라우저)는 인증서와 가지고 있는 CA 리스트 목록을 비교하여 해당하는 CA의 공개 키를 이용하여 인증서를 복호화합니다.
=> 복호화가 진행될 경우 신뢰할 수 있는 인증서라는 의미입니다.

5. 클라이언트는 복호화된 인증서(서버의 공개 키)를 이용하여 새로운 대칭 키를 암호화하고 서버에 전송합니다.

6. 서버는 클라이언트에게 받은 암호화된 대칭 키를 서버 비밀 키를 이용하여 복호화 합니다.
=> 최종적으로, 클라이언트와 서버는 동일한 대칭키를 가지게 됩니다.

7. 새로 생성된 비밀 키를 이용하여 요청과 응답시 데이터를 암호화하여 전송합니다.

HTTPS 사설 인증서 발급

mkcert를 설치해서 인증서를 생성하겠습니다.

$ brew install mkcert // mkcert 설치

// 로컬 환경에서 사용하는 인증서 생성
$ mkcert -install 

// localhost, 127.0.0.1(IPv4), ::1(IPv6)에서 사용할 수 있는 인증서 생성
$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

HTTPS 서버 실습

서버 생성 및 실행 후 https://localhost:3001로 접속하면 https 프로토콜을 이용하여 접속이 가능합니다.

node.js http 모듈 사용

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('https 서버입니다.');
      res.end();
    }
  )
  .listen(3001);

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('https 서버입니다.');
    })
  )
  .listen(3001);

정리

HTTPS를 사용하면 대칭 키 자체가 암호화 되어 전송되기 때문에 외부에 유출될 위험이 없어졌습니다. 따라서 요청이나 응답이 중간에 탈취 되어도 암호화된 데이터를 복호화할 수 없게 됩니다.

profile
새로운 것을 기록하고 복습하는 공간입니다.

0개의 댓글