HTTPS (SSL, TLS)

주형(Jureamer)·2022년 1월 13일
0
post-custom-banner

HTTPS란?

HTTPS는 HyperText Transfer Protocol over Secure Socket Layer의 약자로, HTTP에서 보안이 강화된 버전이다. SSL 또는 TSL 프로토콜을 통해 세션 데이터를 암호화한다. 기본 포트는 443이다 (http는 80)

SSL? TSL?

SSL(Secure Sockets Layer, 보안 소켓 계층)

SSL은 웹사이트와 브라우저(혹은, 두 서버) 사이에 전송된 데이터를 암호화하여 인터넷 연결을 보안을 유지하는 표준 기술이다.

Untitled

TLS(Transport Layer Security, 전송 계층 보안)

TLS는 가장 최신 기술로 더 강력한 버전의 SSL이다. 그러나 SSL이 더 일반적으로 사용되는 용어이기에, 여전히 보안 인증서는 SSL이라 불린다. SSL 3.0부터 TSL 1.0으로 변경되었다.

SSL 암호화 종류

  • 대칭키 암호화 방식
    • 인코딩과 디코딩에 같은 키를 사용하는 알고리즘
    • 단점 : 발송자와 수신자가 서로 대화하려면 둘 다 공유키를 가져야함
    • 대칭키를 전달하는 과정에서 키가 유출이 되면 암호의 내용을 복호화할 수 있기 때문에 위험함
  • 공개키 암호화 방식
    • 인코딩과 디코딩에 다른 키를 사용하는 알고리즘
    • A키로 암호화를 하면 B키로 복호화를 할 수 있고, B키로 암호화 하면 A키로 복호화 할 수 있는 방식
    • 인코딩 키 (public key)는 공개되어 있으며 (그래서 공개키 암호방식이라는 이름이 붙었다.) 보통 디지털 인증서안에 포함되어 있다.
    • 디코딩 키는 (secret key)는 호스트만이 개인 디코딩 키를 알고있다.
    • 공개키와 비공개키의 분리는 메시지의 인코딩은 누구나 할 수 있도록 해주는 동시에, 메시지의 디코딩은 비밀키 소유자에게만 부여한다.
    • 이는 클라이언트가 서버로 안전하게 메시지를 발송하는 것을 쉽게 해준다.
    • 단점 : 공개키 암호화 방식의 알고리즘은 계산이 느린 경향이 있다.

사설인증서 발급 방법

나의 경우엔 mac OS를 사용하여 명령어는 아래와 같다.

$ brew install mkcert

$ brew install nss(--- firefox를 사용할 경우)

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

$ mkcert -install

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

그러면 key.pem, cert.pem이라는 파일이 내 로컬 파일에 깔리게 된다.

key는 나의 공개키를 의미하고, cert는 내 자격증명을 할 수 있는 증명서라고 볼 수 있다.

Untitled

HTTPS 서버 작성 (node.js)

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를 이용한 작성 방법>
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'),
    },
		app.use('/', (req, res) => {
			res.send('Congrats! You made https server now :)');
		})
	)
  .listen(3001);

Reference

profile
작게라도 꾸준히 성장하는게 목표입니다.
post-custom-banner

0개의 댓글