[인증/보안] HTTPS 프로토콜
HTTPS와 HTTP
HTTP
- 인터넷 상에서 정보를 주고 받기 위한 프로토콜
- 클라이언트 <-> 서버
- 암호화되지 않은 방법으로 데이터를 전송(악의적 감청, 데이터 변조 가능)
HTTPS
- 보안이 강화된 HTTP
- Hyper Text Transfer Protocol Secure의 약자
- 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화된다.
- HTTPS는 HTTP의 하부에 SSL과 같은 보안 계층을 제공함으로써 동작한다
: HTTP 요청을 SSL 혹은 TLS라는 알고리즘을 이용해, HTTP 통신을 하는 과정에서 내용을 암호화하여 데이터를 전송하는 방법이다.
- SSL, TLS : 네트워크를 통해 작동하는 서버, 시스템 및 응용 프로그램간 인증 및 데이터 암호화를 제공하는 암호화 프로토콜
HTTPS 특징
1) 암호화
HTTPS 프로토콜의 특징 중 하나는 암호화된 데이터를 주고받기 때문에, 중간에 인터넷 요청이 탈취되더라도 그 내용을 알아볼 수 없다. 정확한 키로 복호화 하기전까지는 어떤 내용인지 알 수 없다.
- HTTPS 암호화 방법에는 1. 대칭 키 암호화 와 2. 비대칭 키 암호화가 있다.
2) 인증서
브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다. 브라우저는 인증서에서 해당 인증서를 발급한 CA 정보를 확인하고 인증된 CA가 발급한 인증서가 아니라면 화면에 경고창을 띄워 서버와 연결이 안전하지 않다는 화면을 보여준다.
- CA(certificate authority)는 다른 곳에서 사용하기 위한 디지털 인증서를 발급하는 하나의 단위이다.
- CA는 공개 키 인증서를 발급하여, 이 인증서는 해당 공개 키가 특정 개인이나 단체, 서버에 속해 있음을 증명한다.
왜 인증서를 사용하는가?
오늘날 우리는 네트워크를 통해 패킷을 주고 받는다. 그러나 중간자 공격에 의해 누군가 패킷을 훔쳐볼 수 있다. 만약 데이터가 암호화된다면, 데이터 유출을 막을 수 있다. 가장 널리 쓰이고 있는 암호화 방식이 SSL/TLS 라는 것인데, 이 방식은 '인증서'라고 하는 일종의 서명을 사용한다.
인증서 라는 것은 결국 '당신이 신뢰할 수 있는 사람이냐' 라는 것을 확인하기 위한 용도이며 이것이 패킷 데이터를 암호화하기 위한 첫 단계라고 생각하면 된다. 인증서가 신뢰할 수 있다는 검증 작업을 거치고 나서야 비로소 데이터 암호화 작업(SSL)이 수행된다.
SSL 디지털 인증서
클라이언트와 서버간의 통신을 공인된 제 3자 업체(CA)가 보증해주는 전자화된 문서
SSL과 TLS
SSL(Secure Socket Layer)와 TLS(Transport Layer Security)는 같은 것이라고 볼 수 있다. SSL은 TCP/IP 암호화 통신에 사용되는 규약으로써 넷스케이프에서 만들었으며, SSL 3.0 버전에서부터 IETF에서 표준으로 정해서 TLS 1.0이 되었다. 하지만 보통 SSL로 많이 불려진다.
** IETF(Internet Engineering Task Force): 국제 인터넷 표준화 기구로 인터넷의 운영, 관리 개발에 대해 협의하고 프로토콜과 구조적인 사안들을 분석하는 표준화 작업 기구.
SSL에서 사용하는 암호화의 종류
- 암호: 텍스트를 아무나 읽지 못하도록 인코딩하는 알고리즘
- 키: 암호의 동작을 변경하는 매개변수, 키에 따라서 암호화 결과가 달라지기 때문에 키를 모르면 복호화가 불가능하다.
대칭키 암호화 방식
- 인코딩과 디코딩에 같은 키를 사용하는 알고리즘
- 대칭키를 전달하는 과정에서 키가 유출되면 암호의 내용을 복호화할 수 있기 때문에 위험
- 보통 사용하는 AES가 대칭키 방식의 암호화.
- 단점으로는 발송자와 수신자가 서로 대화하려면 둘 다 공유키를 가져야 한다.
** AES(Advanced Encryption Standard): 고급 암호화 표준이라는 용어로 사용되며 높은 안정성과 속도로 많이 사용됨.
공개키 암호화 방식
- 두개의 키로 암호화와 복호화를 하는 암호화 방식
- A키로 암호화를 하면 B키로 복호화를 할 수 있고, B키로 암호화를 하면 A키로 복호화를 할 수 있다.
- 보통 하나는 자신만 갖고 이를 개인키(private, secret Key : 서버에서 주는 키)라고 하며, 다른 하나는 상대방에게 공개하며 공개키(public key : 클라이언트가 가지고 있다 -> 브라우저에 저장)라고 얘기한다. 대표적인 공개키(비대칭키)암호화 방식은 RSA.
- 공개키와 개인키의 분리는 메시지의 인코딩은 누구나 할 수 있도록 함과 동시에, 메시지의 디코딩은 개인키를 가지고 있는 사람만 가능하게 한다.
- 단점으로는 처리 알고리즘이 대칭키보다 느리다.
HTTPS 통신에서 실제 전송되는 데이터의 암호화에는 대칭키 암호화 방식을 사용하고, 키 교환에는 공개키(비대칭키) 암호화를 사용하여 처리 속도가 느린 문제를 해결하고 있다.
사설 인증서 발급 및 HTTPS 서버 구현
macOS
macOS 사용자의 경우, Homebrew를 통해 mkcert를 설치할 수 있습니다.
$ brew install mkcert
인증서 생성
먼저 다음 명령어를 통해 로컬을 인증된 발급기관으로 추가해야 한다.
$ mkcert -install
다음은 로컬 환경에 대한 인증서를 만들어야 한다. localhost로 대표되는 로컬 환경에 대한 인증서를 만들려면 다음 명령어를 입력해야 한다.
$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1
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);
이제 서버를 실행한 후 https://localhost:3001로 접속하시면 브라우저의 url 창 왼쪽에 자물쇠가 잠겨있는 HTTPS 프로토콜을 이용한다는 것을 알 수 있다.
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);
Author And Source
이 문제에 관하여([인증/보안] HTTPS 프로토콜), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@usreon/인증보안-HTTPS-프로토콜저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)