HTTPS

HTTPS

Hyper Text Transfer Protocol Secure Socket layer
HTTP 요청을 SSL 혹은 TLS라는 알고리즘을 이용해 HTTP 프로토콜 내용을 암호화하여 데이터를 전송하는 방법
HTTP는 요청 및 응답을 중간에서 가로채는 중간자 공격에 취약하다. 그러나 HTTPS는 암호화 데이터를 주고받기 때문에 HTTP보다 상대적으로 안전하고 인증서를 통해 데이터 제공자의 신원을 보장받을 수 있다.
SSL vs TLS SSL, TLS 모두 웹 서버와 사용자의 엡 브라우저 간 통신을 암호화하는데 사용되는 프로토콜이다. SSL(Secure Sockets Layer)은 보안 소켓 계층이라는 뜻으로 인터넷을 통해 전달되는 정보 보안의 안전한 거래를 허용하기 위해 Netscape 사에서 개발한 인터넷 통신 규약 프로토콜 TLS(Transprot Layer Security)는 SS 3.0을 기초로해서 IETF가 만든 프로토콜로 SSL 3.0 보다 안전하고 프로토콜 스펙을 더 정확하고 안정성을 높이는 목적으로 고안됨
기밀성, 무결성 원칙을 만족?
기밀성 : 오직 인가된 사람

HTTP 특징

인증서

Certificate
인증서를 통해 안전하게 주고받을 수 있음
데이터 제공자 신원 보장
도메인 종속
요청을 받으면 서버는 인증서와 함께 응답 전송. 클라이언트는 응답 받으면 인증서의 도메인과 응답 객체의 도메인이 동일한지 확인
CA(Certificate Authority) : 공인 인증서 발급 기관

비대칭 키 암호화

암호화된 데이터를 주고받기 때문에 중간에 요청이 탈취되더라도 그 내용을 알아볼 수 없다.
다른 키 한쌍으로 암호화 / 복호화 진행
공개키로 암호화하면 비공개키로 복호화 가능
비공개키로 암호화하면 공개키로 복호화 가능
모든 통신에 대해 공개키 방식을 사용하지 않음. 매번 사용하기에는 연산이 복잡. 그래서 통신의 초창기에서만 비밀키로 사용하기 위한 키 만들어 내기 위해 사용

사설 인증서 발급 및 HTTPS 서버 구현

설치
$ brew install mkcert
JavaScript
복사
인증서 생성
# 로컬을 인증된 발급기관으로 추가 $ mkcert -install # 로컬 환경에 대한 인증서 만들기 $ mkcert -key-file key.pem -cert-file cert.pem localhost 127:0:0:1 ::1
JavaScript
복사
key.pem과 cert.pem이 생성된다
key
cert
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);
JavaScript
복사
expressjs 이용
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);
JavaScript
복사

ngrok

HTTP로 만들어진 서버를 HTTPS 프로토콜로 터널링 해주는 프로그램

Reference