๐Ÿ‘ฎ HTTPS

์€์œ ๋กœ๊ทธยท2021๋…„ 10์›” 24์ผ
0

๐Ÿ“š study

๋ชฉ๋ก ๋ณด๊ธฐ
11/21
post-thumbnail

HTTPS


HTTPS(Hyper Text Transfer Protocol Secure)์ด๋ž€?

  • ๊ธฐ์กด HTTP์— ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”๊ฐ€ ์ถ”๊ฐ€ํ•ด ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. HTTP๋Š” ํ…์ŠคํŠธ ๊ตํ™˜ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฐ๊ฐ€ ๋„คํŠธ์›Œํฌ์—์„œ ์‹ ํ˜ธ๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด ๋ณธ๋‹ค๋ฉด ๋‚ด์šฉ์ด ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ํฌ๋‹ค.
  • CA๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด SSL, TLS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ณดํ†ต ํฌํŠธ๋ฒˆํ˜ธ 443๋ฒˆ์„ ์“ด๋‹ค.
  • ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    - ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”
    - ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”

์ธ์ฆ์„œ(Certificate)์™€ CA(Certificate Authority)

ํ•œ ๋ˆˆ์— ๋ณด๋Š” ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ํ•œ๋‹ค.
  2. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ธ์ฆ์„œ์™€ ํ•จ๊ป˜ ์‘๋‹ต์„ ํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ์„œ์— ์ž‘์„ฑ๋œ ๋„๋ฉ”์ธ๊ณผ ์‘๋‹ต ๊ฐ์ฒด์— ์ž‘์„ฑ๋œ ๋„๋ฉ”์ธ(์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ธ์ฆ์„œ)๋ฅผ ๋น„๊ตํ•œ๋‹ค
    • ๋งŒ์•ฝ ์ธ์ฆ์„œ ๋‚ด์šฉ์ด ๊ฐ™๋‹ค๋ฉด, ์˜ฌ๋ฐ”๋ฅธ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ์ธ ๊ฑธ ํ™•์‹ ํ•œ๋‹ค.
    • ๋‹ค๋ฅด๋‹ค๋ฉด, ํ•ด์ปค๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ค‘๊ฐ„์— ํƒˆ์ทจํ•ด ์ œ๋Œ€๋กœ๋œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์˜จ ์‘๋‹ต์ด ์•„๋‹˜์„ ์•Œ๊ณ  ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ ํ˜น์€ ์ž˜๋ชป๋œ ์‘๋‹ต์ž„์„ ํ™•์‹ ํ•œ๋‹ค.

์ธ์ฆ์„œ(Certificate)๋ž€?

๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ ์„œ๋ฒ„๊ฐ€ ์ •๋ง๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ ์„œ๋ฒ„์ธ์ง€ ์ธ์ฆ, ํ™•์ธํ•˜๋Š” ์šฉ๋„์ด๋‹ค. ์ธ์ฆ์„œ ๋‚ด์šฉ์— ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ์žˆ์–ด ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž์— ๋Œ€ํ•œ ์‹ ์›์ด ๋ณด์žฅ๋œ๋‹ค.

CA(Certificate Authority)๋ž€?

์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ณต์ธ๊ธฐ๊ด€์ด๋‹ค. ๊ฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ฐ์ž ์‹ ๋ขฐํ•˜๋Š” CA๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค CA ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค. ๋˜ํ•œ ์ž๊ฒฉ์ด ํ‰์ƒ ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž๊ฒฉ ๋ฐ•ํƒˆ์„ ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”

๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ ์„œ๋กœ ๊ฐ’์ด ์ „ํ˜€ ๋‹ค๋ฅธ 2๊ฐœ์˜ ํ‚ค๊ฐ€ ํ•œ ์Œ์„ ์ด๋ฃจ๋ฉฐ ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”๋ฅผ ํ•œ๋‹ค.

  • ๊ณต๊ฐœํ‚ค
    ๋ชจ๋‘์—๊ฒŒ ๊ณต๊ฐœ ๊ฐ€๋Šฅํ•œ ํ‚ค (์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ณต์œ ํ•˜๋Š” ํ‚ค)
    ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”ํ–ˆ์„ ๊ฒฝ์šฐ -> ๋น„๋ฐ€ํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น„๋ฐ€ํ‚ค(๊ฐœ์ธํ‚ค)
    ์„œ๋ฒ„๋งŒ ๊ฐ€์ง€๊ณ  ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ํ‚ค
    ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ–ˆ์„ ๊ฒฝ์šฐ -> ๊ณต๊ฐœํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”

์•”ํ˜ธํ™”, ๋ณตํ˜ธํ™” ํ•  ๋•Œ ๋™์ผํ•œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

  • ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹๋ณด๋‹ค 1000๋ฐฐ ๋น ๋ฅด๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„์˜ ๋™์ผํ•œ ํ‚ค๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€์ด ์žˆ๊ณ , ์žฆ์€ ํ‚ค ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋ถˆํŽธํ•จ์„ ์ดˆ๋ž˜ํ•œ๋‹ค.

HTTPS ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ - ์š”์ฒญ -> ์„œ๋ฒ„
    ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ๋žœ๋ค ๋ฐ์ดํ„ฐ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™” ๋ฐฉ์‹ ํ›„๋ณด๋“ค์„ ํฌํ•จ์‹œ์ผœ ๋ณด๋‚ธ๋‹ค.
  2. ์„œ๋ฒ„ - ์‘๋‹ต -> ํด๋ผ์ด์–ธํŠธ
    ์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑํ•œ ๋žœ๋ค ๋ฐ์ดํ„ฐ, ์„œ๋ฒ„๊ฐ€ ์„ ํƒํ•œ ํด๋ผ์ด์–ธํŠธ ์•”ํ˜ธํ™” ๋ฐฉ์‹, ์ธ์ฆ์„œ๋ฅผ ํ•จ๊ป˜ ์‘๋‹ตํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ
    ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์ธ์ฆ์„œ๋ฅผ ๋น„๊ตํ•ด ์ œ๋Œ€๋กœ๋œ ๊ณณ์—์„œ ์˜จ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
    1, 2์—์„œ ์ƒ์„ฑ๋œ ๋žœ๋ค ๋ฐ์ดํ„ฐ 2๊ฐœ๋ฅผ ์กฐํ•ฉํ•ด pre master secret ํ‚ค ์ƒ์„ฑํ•œ๋‹ค.
    โžก๏ธ ๋Œ€์นญํ‚ค๋กœ ํ™œ์šฉ ์˜ˆ์ •
  4. ํด๋ผ์ด์–ธํŠธ - ์ „์†ก -> ์„œ๋ฒ„
    ์ธ์ฆ์„œ ์•ˆ์— ์žˆ๋Š” ๊ณต๊ฐœํ‚ค๋ฅผ ํ™œ์šฉํ•ด pre master secret๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ  ์ „์†ก
  5. ์„œ๋ฒ„
    ๋น„๋ฐ€ํ‚ค๋กœ pre master secret ๋ณตํ˜ธํ™”
  6. ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„
    ๊ฐ๊ฐ pre master secret์„ ํ™œ์šฉํ•ด ๋Œ€์นญํ‚ค ์ƒ์„ฑ (master secret ๋˜๋Š” session key)
  7. session key๋ฅผ ํ™œ์šฉํ•œ ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ 
  8. ํ†ต์‹ ์ด ๋๋‚˜๋ฉด ์„ธ์…˜ ์ข…๋ฃŒ, 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;

/* ์ธ์ฆ์„œ ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ https ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ ,
์ธ์ฆ์„œ ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋ฉด http ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. */
// https.createServer([options][, requestListener])
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 ์„œ๋ฒ„ ๊ตฌํ˜„ => ์—ฌ๊ธฐ ์ฐธ๊ณ !

profile
เน‘โ€ขโ€ฟโ€ขเน‘

0๊ฐœ์˜ ๋Œ“๊ธ€