HTTPS
HTTPS(Hyper Text Transfer Protocol Secure)์ด๋?
- ๊ธฐ์กด HTTP์ ๋ฐ์ดํฐ ์ํธํ๊ฐ ์ถ๊ฐํด ๋ณด์์ด ๊ฐํ๋ ํ๋กํ ์ฝ์ด๋ค. HTTP๋ ํ
์คํธ ๊ตํ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๋๊ตฐ๊ฐ ๋คํธ์ํฌ์์ ์ ํธ๋ฅผ ๊ฐ๋ก์ฑ์ด ๋ณธ๋ค๋ฉด ๋ด์ฉ์ด ๋
ธ์ถ๋ ์ํ์ด ํฌ๋ค.
- CA๋ก๋ถํฐ ๋ฐ์ ์ธ์ฆ์๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ์ํ ์๋ฒ๋ก๋ถํฐ ์๋ต ๋ฐ์๋์ง ํ์ธ ๊ฐ๋ฅํ๋ค.
- ๋ฐ์ดํฐ ์ํธํ๋ฅผ ์ํด SSL, TLS ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ณ ๋ณดํต ํฌํธ๋ฒํธ 443๋ฒ์ ์ด๋ค.
- ๋ฐ์ดํฐ ์ํธํ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋น๋์นญํค ์ํธํ
- ๋์นญํค ์ํธํ
์ธ์ฆ์(Certificate)์ CA(Certificate Authority)
ํ ๋์ ๋ณด๋ ํ๋ฆ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญ์ ํ๋ค.
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์ฆ์์ ํจ๊ป ์๋ต์ ํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ธ์ฆ์์ ์์ฑ๋ ๋๋ฉ์ธ๊ณผ ์๋ต ๊ฐ์ฒด์ ์์ฑ๋ ๋๋ฉ์ธ(์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ธ์ฆ์)๋ฅผ ๋น๊ตํ๋ค
- ๋ง์ฝ ์ธ์ฆ์ ๋ด์ฉ์ด ๊ฐ๋ค๋ฉด, ์ฌ๋ฐ๋ฅธ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ์ธ ๊ฑธ ํ์ ํ๋ค.
- ๋ค๋ฅด๋ค๋ฉด, ํด์ปค๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ค๊ฐ์ ํ์ทจํด ์ ๋๋ก๋ ์๋ฒ๋ก๋ถํฐ ์จ ์๋ต์ด ์๋์ ์๊ณ ์ค๊ฐ์ ๊ณต๊ฒฉ ํน์ ์๋ชป๋ ์๋ต์์ ํ์ ํ๋ค.
์ธ์ฆ์(Certificate)๋?
๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ ์๋ฒ๊ฐ ์ ๋ง๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ ์๋ฒ์ธ์ง ์ธ์ฆ, ํ์ธํ๋ ์ฉ๋์ด๋ค. ์ธ์ฆ์ ๋ด์ฉ์ ์๋ฒ์ ๋๋ฉ์ธ ๊ด๋ จ ์ ๋ณด๊ฐ ์์ด ๋ฐ์ดํฐ ์ ๊ณต์์ ๋ํ ์ ์์ด ๋ณด์ฅ๋๋ค.
CA(Certificate Authority)๋?
์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ ๊ณต์ธ๊ธฐ๊ด์ด๋ค. ๊ฐ ๋ธ๋ผ์ฐ์ ๋ ๊ฐ์ ์ ๋ขฐํ๋ CA๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋์ ๊ฐ ๋ธ๋ผ์ฐ์ ๋ง๋ค CA ์ฐจ์ด๊ฐ ๋๋ค. ๋ํ ์๊ฒฉ์ด ํ์ ์ ์ง๋๋ ๊ฒ์ด ์๋๋ผ ์๊ฒฉ ๋ฐํ์ ๋นํ ์ ์๋ค.
๋น๋์นญํค ์ํธํ
๊ณต๊ฐํค ์ํธํ๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ์๋ก ๊ฐ์ด ์ ํ ๋ค๋ฅธ 2๊ฐ์ ํค๊ฐ ํ ์์ ์ด๋ฃจ๋ฉฐ ์ํธํ ๋ฐ ๋ณตํธํ๋ฅผ ํ๋ค.
- ๊ณต๊ฐํค
๋ชจ๋์๊ฒ ๊ณต๊ฐ ๊ฐ๋ฅํ ํค (์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๊ณต์ ํ๋ ํค)
๊ณต๊ฐํค๋ก ์ํธํํ์ ๊ฒฝ์ฐ -> ๋น๋ฐํค๋ก๋ง ๋ณตํธํ ํ ์ ์๋ค.
- ๋น๋ฐํค(๊ฐ์ธํค)
์๋ฒ๋ง ๊ฐ์ง๊ณ ์๊ณ ์์ด์ผ ํ๋ ํค
๋น๋ฐํค๋ก ์ํธํํ์ ๊ฒฝ์ฐ -> ๊ณต๊ฐํค๋ก๋ง ๋ณตํธํ ํ ์ ์๋ค.
๋์นญํค ์ํธํ
์ํธํ, ๋ณตํธํ ํ ๋ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์
- ๊ณต๊ฐํค ์ํธํ ๋ฐฉ์๋ณด๋ค 1000๋ฐฐ ๋น ๋ฅด๋ค.
- ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ์ ๋์ผํ ํค๋ฅผ ๊ณต์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํค๊ด๋ฆฌ์ ์ด๋ ค์์ด ์๊ณ , ์ฆ์ ํค ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ์ ๋ถํธํจ์ ์ด๋ํ๋ค.
HTTPS ํ๋ฆ
- ํด๋ผ์ด์ธํธ - ์์ฒญ -> ์๋ฒ
ํด๋ผ์ด์ธํธ๊ฐ ์์ฑํ ๋๋ค ๋ฐ์ดํฐ, ์ฌ์ฉ ๊ฐ๋ฅํ ์ํธํ ๋ฐฉ์ ํ๋ณด๋ค์ ํฌํจ์์ผ ๋ณด๋ธ๋ค.
- ์๋ฒ - ์๋ต -> ํด๋ผ์ด์ธํธ
์๋ฒ๊ฐ ์์ฑํ ๋๋ค ๋ฐ์ดํฐ, ์๋ฒ๊ฐ ์ ํํ ํด๋ผ์ด์ธํธ ์ํธํ ๋ฐฉ์, ์ธ์ฆ์๋ฅผ ํจ๊ป ์๋ตํ๋ค.
- ํด๋ผ์ด์ธํธ
์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ธ์ฆ์๋ฅผ ๋น๊ตํด ์ ๋๋ก๋ ๊ณณ์์ ์จ ๊ฒ์ธ์ง ํ์ธํ๋ค.
1, 2์์ ์์ฑ๋ ๋๋ค ๋ฐ์ดํฐ 2๊ฐ๋ฅผ ์กฐํฉํด pre master secret ํค ์์ฑํ๋ค.
โก๏ธ ๋์นญํค๋ก ํ์ฉ ์์
- ํด๋ผ์ด์ธํธ - ์ ์ก -> ์๋ฒ
์ธ์ฆ์ ์์ ์๋ ๊ณต๊ฐํค๋ฅผ ํ์ฉํด pre master secret๋ฅผ ์ํธํํ๊ณ ์ ์ก
- ์๋ฒ
๋น๋ฐํค๋ก pre master secret ๋ณตํธํ
- ํด๋ผ์ด์ธํธ, ์๋ฒ
๊ฐ๊ฐ pre master secret์ ํ์ฉํด ๋์นญํค ์์ฑ (master secret ๋๋ session key)
- session key๋ฅผ ํ์ฉํ ๋์นญํค ์ํธํ ๋ฐฉ์์ผ๋ก ํต์
- ํต์ ์ด ๋๋๋ฉด ์ธ์
์ข
๋ฃ, session key ํ๊ธฐ
- 1 ~ 6๊น์ง๋ ๋น๋์นญํค ์ํธํ ๋ฐฉ์์ผ๋ก ํต์ ํ๊ณ , 7 ~ 8๊น์ง๋ ๋์นญํค ์ํธํ ๋ฐฉ์์ผ๋ก ํต์ ํ๋ค.
- ๋ชจ๋ ํต์ ์ด ๋๋๋ฉด ์ธ์
ํค๋ ํ๊ดดํ์ง๋ง (
session.destroy()
) ๊ณต๊ฐํค, ๋น๋ฐํค๋ ๋จ์์๋ค.
HTTPS ์๋ฒ ์์ฑ
const fs = require('fs');
const express = require('express');
const app = express();
const https = require('https');
let server;
if (fs.existsSync("./key.pem") && fs.existsSync("./cert.pem")) {
server = https
.createServer(
{
key: fs.readFileSync(__dirname + `/` + "key.pem", "utf-8"),
cert: fs.readFileSync(__dirname + `/` + "cert.pem", "utf-8"),
},
app
)
.listen(4000);
} else {
server = app.listen(4000);
}
module.exports = server;
https.createServer()๋ฅผ ์ด์ฉํด https ์๋ฒ ๊ตฌํ => ์ฌ๊ธฐ ์ฐธ๊ณ !