로컬 환경(localhost)에서 인증서를 생성하고, 인증서를 이용해 HTTPS 서버 만들기
HTTPS 사설 인증서 발급 및 서버 구현
현업에서는 HTTPS 프로토콜을 사용하는 것이 일반적이고, 특히 HTTPS 프로토콜은 인증의 중요한 부분을 차지하기 때문에, 이번 포스팅에서는 직접 HTTPS 서버를 만들어 보겠다.
설치
mkcert라는 프로그램을 이용해서 로컬 환경(내 컴퓨터)에서 신뢰할 수 있는 인증서를 만들 수 있다.
Ubuntu
우분투의 경우 다음 명령어를 이용해 설치한다.
$ 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
macOS 사용자의 경우, Homebrew를 통해 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.pem의 경우 개인 키이므로 git에 커밋하지 않고, 암호처럼 다루어야 한다.
key와 cert이란
key와 cert는 모두 암호화와 보안에 관련된 용어이다.
- Key는 보통 암호화 및 복호화를 위한 비밀번호나 암호화 키를 말한다.
- 이는 대칭키 암호화 방식 또는 공개키 암호화 방식에서 사용된다.
- 대칭키 암호화에서는 하나의 비밀키가 암호화 및 복호화에 사용되며, 공개키 암호화에서는 공개키와 비밀키 쌍이 사용된다.
- 반면 Cert는 인증서를 나타내며, 공개키 인프라(PKI)에서 사용된다.
- 인증서는 일반적으로 SSL/TLS 연결에서 사용된다.
- SSL/TLS 연결은 인터넷에서 정보를 안전하게 전송하기 위해 사용되며, 이러한 연결에서는 대개 서버가 자신의 공개키를 제공하고 클라이언트는 이를 사용하여 연결을 안전하게 유지한다.
- 이 공개키는 인증서에서 사용된다.
HTTPS 서버 작성
Node.js 환경에서 HTTPS 서버를 작성하기 위해서는 https 내장 모듈을 이용할 수 있다. express.js를 이용해 https 서버를 만들 수도 있다. 먼저는 방금 생성한 인증서 파일들을 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);
'FE > Server' 카테고리의 다른 글
세션기반 인증 (Session-based Authentication) (0) | 2023.05.02 |
---|---|
쿠키(Cookie)의 개념과 작동원리 (0) | 2023.05.02 |
[Network] Airline 서버 구현 (2) : 서버 개발하기 (0) | 2023.04.09 |
[Network] Airline 서버 구현 (1) : Airline Server API document (0) | 2023.04.06 |
[Network] Express로 간단한 웹 서버 만들어보기 (라우터) (0) | 2023.04.05 |