What is ๐Ÿฅข ๋Œ€์นญํ‚ค / ๐Ÿชก๋น„๋Œ€์นญํ‚ค / ๐Ÿ“ฆHTTPS

shleecloudยท2021๋…„ 10์›” 24์ผ
0

Security

๋ชฉ๋ก ๋ณด๊ธฐ
2/6

โœ ๋“ค์–ด๊ฐ€๋ฉฐ

์‹ค์Šตํ•˜๋ฉด์„œ Hash์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋งŽ์ด ๋“ค์—ˆ์ง€๋งŒ ๊ณต๊ฐœํ‚ค์™€ ๋น„๊ณต๊ฐœํ‚ค์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋ชจํ˜ธํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ key.pem, cert.pem ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ  ๋‚˜๋ˆ ์ฃผ๋Š” ๋ถ€๋ถ„๋„ ์กฐ๊ธˆ ์–ด์ƒ‰ํ•˜๋‹ค. ์ด ๋ถ€๋ถ„์„ ์ค‘์ ์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

๐Ÿฅข ๋Œ€์นญํ‚ค

๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ ์•”๋ณตํ˜ธํ™”์— ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๊ฐ€ ๋™์ผํ•œ ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

  • ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹๋ณด๋‹ค 1000๋ฐฐ ๋น ๋ฅด๋‹ค. wow!
  • ๋ชจ๋“  ํ†ต์‹ ์— ํ‚ค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ๋ผ์„œ ๊ด€๋ฆฌํ•  ํ‚ค๊ฐ€ ๋งŽ์•„์ง„๋‹ค.
  • ํ‚ค๋ฅผ ์ „์†กํ•ด์•ผ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    • 1:1 ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ณ„๋„์˜ ํ‚ค๊ตํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค.

๐Ÿชก ๋น„๋Œ€์นญํ‚ค (๊ณต๊ฐœํ‚ค)

๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ ์•”๋ณตํ˜ธํ™”์— ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉฐ ๋”ฐ๋ผ์„œ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ์—์„œ๋Š” ์†ก์ˆ˜์‹ ์ž ๋ชจ๋‘ ํ•œ์Œ์˜ ํ‚ค(๊ฐœ์ธํ‚ค, ๊ณต๊ฐœํ‚ค)๋ฅผ ๊ฐ–๊ณ ์žˆ๊ฒŒ ๋œ๋‹ค.

  • ํ‚ค๋ฅผ ๊ตํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›๋Š” ํ‚ค๋Š” ๊ณต๊ฐœํ‚ค๋ผ์„œ ๊ณต๊ฐœํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.

๋น„๋Œ€์นญํ‚ค ์ž‘์—… ํ๋ฆ„

  • ์ˆ˜์‹ ์ž(์„œ๋ฒ„)๋Š” ๊ณต๊ฐœํ‚ค๐Ÿ“–์™€ ๊ฐœ์ธํ‚ค๐Ÿ”‘๋ฅผ ๋งŒ๋“ ๋‹ค.
    • ์ˆ˜์‹ ์ž๋Š” ๊ณต๊ฐœํ‚ค๐Ÿ“–๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
  • ์†ก์‹ ์ž๋Š” ์ˆ˜์‹ ์ž์˜ ๊ณต์œ ๋œ ๊ณต๊ฐœํ‚ค๐Ÿ“–๋กœ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ํ›„ ์ „์†กํ•œ๋‹ค.
    • ๋ˆ„๊ตฐ๊ฐ€ ์ค‘๊ฐ„์— ํƒˆ์ทจํ•ด๋„ ์ˆ˜์‹ ์ž์˜ ๊ฐœ์ธํ‚ค๐Ÿ”‘๊ฐ€ ์—†์œผ๋ฉด ๋ณผ ์ˆ˜ ์—†๋‹ค.
  • ์ˆ˜์‹ ์ž๋Š” ๊ฐœ์ธํ‚ค๐Ÿ”‘๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณตํ˜ธํ™”ํ•œ๋‹ค.

๐Ÿ‡ ๋Œ€์นญํ‚ค ๋น„๋Œ€์นญํ‚ค ๋น„๊ต

๊ตฌ๋ถ„๋Œ€์นญํ‚ค๋น„ ๋Œ€์นญํ‚ค
ํ‚ค ๊ด€๊ณ„์•”ํ˜ธํ™”ํ‚ค = ๋ณตํ˜ธํ™”ํ‚ค์•”ํ˜ธํ™”ํ‚ค โ‰  ๋ณตํ˜ธํ™”ํ‚ค
ํ‚ค ์ „์†ก๋น„๋ฐ€ํ‚ค ์ „์†ก ํ•„์š”๋น„๋ฐ€ํ‚ค ์ „์†ก ๋ถˆํ•„์š”
ํ‚ค ๊ฐฏ์ˆ˜n(n-1)/22n
์žฅ์ ๊ณ ์†, ๊ฒฝ์ œ์„ฑ ๋†’์Œํ‚ค ๋ถ„๋ฐฐ ๋ฐ ๊ด€๋ฆฌ์šฉ์ด
๋‹จ์ ํ‚ค ๋ถ„๋ฐฐ ๋ฐ ๊ด€๋ฆฌ๋ถˆํŽธ์ €์†, ๊ฒฝ์ œ์„ฑ ๋‚ฎ์Œ

๐Ÿ“ฆ HTTPS

TLS๋ฅผ ์‚ฌ์šฉํ•ด ์•”ํ˜ธํ™”๋œ ์—ฐ๊ฒฐ์„ ํ•˜๋Š” HTTP๋ฅผ HTTPS(HTTP Secure)๋ผ๊ณ  ํ•œ๋‹ค. ์›น์‚ฌ์ดํŠธ ์ฃผ์†Œ ์—ญ์‹œ http://๊ฐ€ ์•„๋‹Œ https://๋กœ ์‹œ์ž‘๋œ๋‹ค. ๊ธฐ๋ณธ ํฌํŠธ๋Š” 80๋ฒˆ์ด ์•„๋‹Œ 443๋ฒˆ์„ ์“ด๋‹ค.

HTTPS์— ํ•„์š”ํ•œ ์š”์†Œ

  • ์ธ์ฆ์„œ
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค€ ์„œ๋ฒ„๊ฐ€ ์ •๋ง๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค€ ์„œ๋ฒ„์ธ์ง€ ์ธ์ฆ ํ™•์ธํ•˜๋Š” ์šฉ๋„. ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ์žˆ์–ด์„œ ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž๋ฅผ ํ‘œ๊ธฐํ•จ
  • CA (Certificate Authority, ๊ณต์ธ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ธฐ๊ด€)
    • ๊ฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ์‹ ๋ขฐํ•˜๋Š” ์ธ์ฆ์„œ์˜ ๊ธฐ๊ด€ ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
  • ๋น„๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™”
    • ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์—†์Œ. (์‹ฌ์ง€์–ด ์•”ํ˜ธํ™”ํ•œ ๋ณธ์ธ์กฐ์ฐจ ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์—†๋‹ค!)
  • ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”
    • ๋น„๋Œ€์นญ ํ‚ค๋กœ ์ž„์˜์˜ ํ‚ค๋ฅผ ์ฃผ๊ณ ๋ฐ›์€ ํ›„ ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋กœ ์ „ํ™˜.

HTTPS ์ž‘์—…ํ๋ฆ„

  • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ๊ณต๊ฐœํ‚ค์™€ ์ธ์ฆ์„œ๋กœ ์‘๋‹ต
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ์„œ์˜ ๋„๋ฉ”์ธ๊ณผ ์‘๋‹ตํ•œ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์„ ๋น„๊ตํ•œ๋‹ค.
    • ์ธ์ฆ์„œ์— ์จ์žˆ๋Š” ์‚ฌ๋žŒ๊ณผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ณด๋‚ธ๊ฒŒ ์•„๋‹Œ์ง€ ํ™•์ธ ๐Ÿ•ต๏ธ
    • ๋งŒ์•ฝ ๋‹ค๋ฅด๋‹ค๋ฉด ์ค‘๊ฐ„์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ณ€์กฐ๋œ URL์ด๋‚˜ ๋„๋ฉ”์ธ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์ž„์˜์˜ ํ‚ค(pre master secret)๋ฅผ ๋งŒ๋“ค์–ด์„œ ์•”ํ˜ธํ™” ํ›„ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ž„์˜์˜ ํ‚ค๋กœ ๊ฐ๊ฐ ๋Œ€์นญํ‚ค๋ฅผ ๋งŒ๋“ค๊ณ  ํ†ต์‹ ํ•œ๋‹ค.

๋น„๋Œ€์นญํ‚ค๋กœ ์ดˆ๊ธฐ ํ†ต์‹  ๋ณด์•ˆ์„ ํ™•์ธํ•œ๋‹ค.
์ž„์˜์˜ ํ‚ค(pre master secret)๋ฅผ ์ฃผ๊ณ  ๋ฐ›์€ ์ดํ›„ ๋Œ€์นญํ‚ค๋กœ ํ†ต์‹ ํ•œ๋‹ค.

๐Ÿ’ป NodeJS HTTPS ๊ตฌํ˜„

์„œ๋ฒ„์—์„œ ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ชจ๋“ˆ์„ ํ†ตํ•ด HTTPS๋ฅผ ๋„์šฐ๋ฉด ์ดํ›„๋ถ€ํ„ฐ๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ๋ชจ๋“ˆ์—์„œ ์•Œ์•„์„œ ์ง„ํ–‰ํ•ด์ค€๋‹ค.

์„œ๋ฒ„ ์ธ์ฆ์„œ, ๊ณต๊ฐœํ‚ค / ๊ฐœ์ธํ‚ค ์ƒ์„ฑ

mkcert ๋ชจ๋“ˆ๋กœ ์ž์ฒด ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

// macOS ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ, Homebrew๋ฅผ ํ†ตํ•ด mkcert๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ brew install mkcert
// ๋จผ์ € ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ์„ ์ธ์ฆ๋œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
$ mkcert -install
// ๋‹ค์Œ์€ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
// localhost๋กœ ๋Œ€ํ‘œ๋˜๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

cert.pem ํŒŒ์ผ์€ ์ธ์ฆ์„œ์™€ ๊ณต๊ฐœํ‚ค๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

$ openssl x509 -in ./cert.pem -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: .......
    Signature Algorithm: sha256WithRSAEncryption
    ...
    
    
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:dc:b5:15:70:1f:e8:98:69:9b:7c:92:5f:46:99:
                    c1:fb:0d:5c:c0:62:35:46:51:49:df:ce:25:3b:cb:
                    ...
-----BEGIN CERTIFICATE-----
MIIElDCCAvygAwIBAgIQA1SODLu5nU4/A5r3hRDQcjANBgkqhkiG9w0BAQsFADCB
qTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMT8wPQYDVQQLDDZzZXVu
...

cert ํŒŒ์ผ์€ ๊ณต๊ฐœ๋˜์–ด๋„ ์ƒ๊ด€ ์—†์ง€๋งŒ key ํŒŒ์ผ์€ ๊ณต๊ฐœํ•ด์„  ์•ˆ๋œ๋‹ค.
key ํŒŒ์ผ์€ .gitignore ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณต๊ฐœํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. ํŒŒ์ผ๋ช…๋งŒ ์ ์–ด๋‘๋ฉด ์ตœ์ƒ๋‹จ๋ถ€ํ„ฐ ์ตœํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ๋ชจ๋‘ ์ ์šฉ๋œ๋‹ค.

node_modules
.env
*.pem
localhost*
*package-lock.json

HTTPS ์„œ๋ฒ„ ์ƒ์„ฑ

const fs = require('fs');
const express = require('express');
// ์„œ๋ฒ„ ์ƒ์„ฑ
const app = express();
const https = require('https');

// https.createServer ๋ฉ”์†Œ๋“œ์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ app์ด ๋“ค์–ด๊ฐ„๋‹ค. 
const server = https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    app
  )
  .listen(4000);
module.exports = server;

์ฐธ์กฐ URL

https://opentutorials.org/course/228/4894
https://wayhome25.github.io/cs/2018/03/11/ssl-https/

profile
๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. https://shlee.cloud

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