14주차 HTTPS 대칭키 비대칭키

lim1313·2021년 10월 20일
0

부트캠프 TIL

목록 보기
42/49

🌈 HTTPS

HTTP는 암호화되지 않은 방법으로 데이터를 전송하기 때문에 서버와 클라이언트가 주고 받는 메시지를 감청하는 것이 매우 쉽다. 예를들어 로그인을 위해서 서버로 비밀번호를 전송하거나, 또는 중요한 기밀 문서를 열람하는 과정에서 악의적인 감청이나 데이터의 변조등이 일어날 수 있다는 것이다. 이를 보안한 것이 HTTPS다.

HTTPS는 HTTP 요청을 SSL 혹은 TLS라는 알고리즘을 이용해, HTTP 통신을 하는 과정에서 내용을 암호화하여 데이터를 전송하는 방법이다.
HTTPS 프로토콜의 특징 중 하나는 암호화된 데이터를 주고받기 때문에, 중간에 인터넷 요청이 탈취되더라도 그 내용을 알아볼 수 없다. 내용이 암호화되어 전송되기 때문에 정확한 키로 복호화 하기전까지는 어떤 내용인지 알 수 없다.

HTTPS 프로토콜의 또 다른 특징 중 하나는 브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다는 점이다.
브라우저는 인증서에서 해당 인증서를 발급한 CA 정보를 확인하고 인증된 CA가 발급한 인증서가 아니라면 화면에 경고창을 띄워 서버와 연결이 안전하지 않다는 화면을 보여준다.

브라우저는 인증서의 도메인과 데이터를 제공한 제공자의 도메인을 비교할 수 있기 때문에 인증서의 도메인 정보와 데이터 제공자의 도메인 정보가 다른 '중간자 공격'을 감지하여 보안 위협으로부터 사용자 및 사용자의 데이터를 보호할 수 있다.

⚡ 용어 정리

  • SSL: 보안 소켓 계층(Secure Sockets Layer, SSL)
    : SSL은 웹사이트와 브라우저(혹은, 두 서버) 사이에 전송된 데이터를 암호화하여 인터넷 연결을 보안을 유지하는 표준 기술이다. 이는 해커가 개인 정보 및 금융 정보를 포함한 전송되는 모든 정보를 열람하거나 훔치는 것을 방지한다.

  • TLS: 전송 계층 보안(Transport Layer Security, TLS)
    : TLS는 가장 최신 기술로 더 강력한 버전의 SSL이다. 그러나 SSL이 더 일반적으로 사용되는 용어이기에, 여전히 보안 인증서는 SSL이라 불린다.

  • HTTPS: 하이퍼 텍스트 프로토콜 보안(Hyper Text Protocol Secure, HTTPS)
    : HTTPS는 웹사이트를 SSL/TLS 인증서로 보안하는 경우 URL 창에 표시된다.

  • 인증서
    : 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장한다.
    : SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.
    : 브라우저는 인증서의 도메인과 데이터를 제공한 제공자의 도메인을 비교할 수 있기 때문에 인증서의 도메인 정보와 데이터 제공자의 도메인 정보가 다른 '중간자 공격'을 감지하여 보안 위협으로부터 사용자 및 사용자의 데이터를 보호할 수 있다.

    중간에 해커가 요청을 탈취하는 공격이 발생하면 인증서의 도메인과 응답의 도메인이 같지 않아서, 데이터를 제공하는 서버가 아닌 것을 확실히 알 수 있다.
    즉, 전혀 다른 데이터 제공자임을 알게 된다.

  • CA
    : Certificate Authority
    : 공인 인증서 발급하는 기관
    : 각 브라우저는 각자 신뢰하는 CA를 가진다.

  • SSL 인증서 내용
    : 1. 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
    : 2. 서버 측 공개키 (공개키 내용, 공개키의 암호화 방법)

  • 대칭키
    : 대칭키는 동일한 키로 암호화와 복호화를 같이 할 수 있는 방식의 암호화 기법을 의미

  • 비대칭키( 공개키 )
    : A키로 암호화를 하면 B키로 복호화 할 수 있고, B키로 암호화하면 A키로 복호화 할 수 있는 방식
    : 두개의 키 중 하나를 비공개키(private key, 개인키, 비밀키라고도 부른다)로하고, 나머지를 공개키(public key)로 지정한다. 비공개키는 자신만이 가지고 있고, 공개키를 타인에게 제공한다. 공개키를 제공 받은 타인은 공개키를 이용해서 정보를 암호화한다. 암호화한 정보를 비공개키를 가지고 있는 사람에게 전송한다. 비공개키의 소유자는 이 키를 이용해서 암호화된 정보를 복호화 한다. 이 과정에서 공개키가 유출된다고 해도 비공개키를 모르면 정보를 복호화 할 수 없기 때문에 안전하다. 공개키로는 암호화는 할 수 있지만 복호화는 할 수 없기 때문이다.


⚡ SSL의 동작방법

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

생활코딩 SSL



🌈 로컬 인증서 생성

mkcert라는 프로그램을 통해 로컬화경에서 신뢰할 수 있는 인증서 생성하기

⚡ mkcert 설치

ubuntu mkcert 생성

$ sudo apt install libnss3-tools
$ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/

macOS 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 서버 작성

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로 접속

profile
start coding

0개의 댓글