노드 https, http2
https
웹 서버에 SSL 암호화를 추가하는 모듈이다.
오고 가는 데이터를 암호화해서 중간에 다른 사람이 요청을 가로채더라도 내용을 확인할 수 없다.
개인 정보가 있는 곳은 https 적용이 필수이다.
https 적용 화면은 다음과 같다
주소창 맨 앞에 자물쇠 표시가 보안 연결 (https)이 되었다는 뜻이다.
http로 요청을 보낼 경우를 살펴보면 너무 상세한 정보가 다 공개되어 있다.
Response Headers
Request URL
Cookie
Query String 등등...
이런 요청들이 만약에 탈취당한다면 보안상 매우 큰 위협이 될 수 있다. 따라서 보안을 생각한다면 https 적용은 거의 필수라고 생각한다.
https는 이런 요청들을 암호화 해서 전달을 한다. 그래서 만약 요청들이 탈취 당한다고 해도 암호화 되어서 악용이 되지 않는다. 실제로 암호화 정도가 강력해서 거의 풀 수 없다고 생각된다. 실무에서는 https가 당연하다.
당연히 노드에서도 https 모듈을 제공한다.
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(8080, () => { // 서버 연결
console.log('8080번 포트에서 서버 대기 중입니다!');
});
이런 간단한 http 서버 만드는 코드를 https 로 적용하면 다음과 같다
//server1-3.js
const https = require('https');
const fs = require('fs');
https.createServer({
cert: fs.readFileSync('도메인 인증서 경로'),
key: fs.readFileSync('도메인 비밀키 경로'),
ca: [
fs.readFileSync('상위 인증서 경로'),
fs.readFileSync('상위 인증서 경로'),
],
}, (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(443, () => {
console.log('443번 포트에서 서버 대기 중입니다!');
});
https 모듈로 서버를 만들었다. 다른 부분은 대부분 같지만 cert, key, ca 의 인수들이 추가가 된 것을 볼 수 있다.
createServer가 인자를 두 개 받았다.
- 첫 번째 인자는 인증서와 관련된 옵션 객체
- 인증서를 구입할 때 얻을 수 있는 파일 넣기
- 두 번째 인자는 서버 로직이다.
https는 요청을 암호화를 한다고 했다. 암호화를 위해서는 인증서가 필요하고 그것을 인증기관에서 받아와야 한다.
예를 들어 naver.com에 보안 연결을 신청을 했다고 하면 인증기관에서 인증 파일들을 준다.
그 파일들을 받아서 저장을 해 두고 fs를 통해 읽어서 적용하는 방식이다.
서버를 만들때는 이런 경우를 제외하고 Sync 를 쓰지 말자.
1. 서버에서 한 번만 실행할 경우
2. 초기화 할때의 경우
아무튼 위의 예시의 경우는 2번에 해당된다. 서버가 본격적으로 시작되기 전, 인증기관에서 받아온 인증서관련 파일들을 읽고 적용하는 과정이 https.createServer 시작 부분에 있다.
*https의 기본 포트번호는 443 이다. 생략이 가능하다.
http2
SSL 암호화와 더불어 최신 HTTP 프로토콜인 http/2를 사용하는 모듈
- 요청 및 응답 방식이 기존 http/1.1보다 개선됐다.
- 웹의 속도도 개선됐다.
http2는 동시성을 갖췄다. 여러 요청을 동시에 처리하는 모습을 볼 수 있다.
실제로 작은 이미지가 여러개 있다고 하면 http에서는 하나씩 받아오는데 http2에서는 동시에 받아와서 동작이 매우 빠르다.
실제로 적용했을 때의 코드는 다음과 같다
https 모듈을 http2로, createServer 메서드를 createSevureServer로 바꿔줘야 한다.
const http2 = require('http2');
const fs = require('fs');
http2.createSecureServer({
cert: fs.readFileSync('도메인 인증서 경로'),
key: fs.readFileSync('도메인 비밀키 경로'),
ca: [
fs.readFileSync('상위 인증서 경로'),
fs.readFileSync('상위 인증서 경로'),
],
}, (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(443, () => {
console.log('443번 포트에서 서버 대기 중입니다!');
});