Minhhk 2023. 1. 7. 19:47
πŸ“Œ HTTP

 

HTTP

  • ν΄λΌμ΄μ–ΈνŠΈ μ„œλ²„ ꡬ쑰
    • Request Response ꡬ쑰
  • λ¬΄μƒνƒœ ν”„λ‘œν† μ½œ(Stateless)
    • 둜그인이 ν•„μš” μ—†λŠ” λ‹¨μˆœν•œ μ„œλΉ„μŠ€ μ†Œκ°œ ν™”λ©΄ 같은 경우,,
    • μž₯점: μ„œλ²„ ν™•μž₯μ„± λ†’μŒ(μŠ€μΌ€μΌ 아웃)→(응닡 μ„œλ²„λ₯Ό μ‰½κ²Œ λ°”κΏ€ 수 μžˆμ–΄ λ¬΄ν•œν•œ μ„œλ²„ 증섀 κ°€λŠ₯)
    • 단점: ν΄λΌμ΄μ–ΈνŠΈκ°€ μΆ”κ°€ 데이터 전솑
  • λΉ„μ—°κ²°μ„±(Connectionless)
    • μš”μ²­μ„ 주고받을 λ•Œλ§Œ 연결을 μœ μ§€ν•˜κ³  응닡을 μ£Όκ³  λ‚˜λ©΄ TCP/IP 연결을 λŠλŠ”λ‹€
    • λ”°λΌμ„œ μ΅œμ†Œν•œ μžμ›μœΌλ‘œ μ„œλ²„μœ μ§€ κ°€λŠ₯
  • HTTP 메세지
  • λ‹¨μˆœν•¨, ν™•μž₯ κ°€λŠ₯

 

 

 

πŸ“Œ HTTPS (HTTP Secure)

μ•”ν˜Έν™” 방식

데이터λ₯Ό μ•”ν˜Έν™”λ₯Ό ν•  λ•Œμ—λŠ” μ•”ν˜Έν™”ν•  λ•Œ μ‚¬μš©ν•  ν‚€, μ•”ν˜Έν™”ν•œ 것을 해석(λ³΅ν˜Έν™”)ν•  λ•Œ μ‚¬μš©ν•  ν‚€κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

이 λ•Œ μ•”ν˜Έν™”μ™€ λ³΅ν˜Έν™”ν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν‚€κ°€ λ™μΌν•˜λ‹€λ©΄ λŒ€μΉ­ ν‚€ μ•”ν˜Έν™” 방식,

λ‹€λ₯΄λ‹€λ©΄ 곡개 ν‚€(λΉ„λŒ€μΉ­ ν‚€) μ•”ν˜Έν™” 방식이라고 ν•©λ‹ˆλ‹€.

 

 

1. λŒ€μΉ­ ν‚€ μ•”ν˜Έν™” 방식

λŒ€μΉ­ ν‚€ μ•”ν˜Έν™” 방식은 ν•˜λ‚˜μ˜ ν‚€λ§Œ μ‚¬μš©ν•©λ‹ˆλ‹€. μ•”ν˜Έν™”ν•  λ•Œ μ‚¬μš©ν•œ ν‚€λ‘œλ§Œ λ³΅ν˜Έν™”κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

두 개의 ν‚€λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 곡개 ν‚€ 방식에 λΉ„ν•΄μ„œ μ—°μ‚° 속도가 λΉ λ₯΄λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ ν‚€λ₯Ό μ£Όκ³  λ°›λŠ” κ³Όμ •μ—μ„œ νƒˆμ·¨ λ‹Ήν–ˆμ„ κ²½μš°μ—λŠ” μ•”ν˜Έν™”κ°€ μ†Œμš©μ—†μ–΄μ§€κΈ° λ•Œλ¬Έμ— ν‚€λ₯Ό κ΄€λ¦¬ν•˜λŠ”λ° 신경을 많이 써야 ν•©λ‹ˆλ‹€.

 

2. 곡개 ν‚€(λΉ„λŒ€μΉ­ ν‚€) μ•”ν˜Έν™” 방식

λΉ„λŒ€μΉ­ ν‚€ μ•”ν˜Έν™” 방식은 두 개의 ν‚€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ•”ν˜Έν™”ν•  λ•Œ μ‚¬μš©ν•œ 킀와 λ‹€λ₯Έ ν‚€λ‘œλ§Œ λ³΅ν˜Έν™”κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ 두 개의 ν‚€λ₯Ό 각각 곡개 ν‚€, λΉ„λ°€ ν‚€ 라고 λΆ€λ¦…λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ 곡개 ν‚€λŠ” 이름 κ·ΈλŒ€λ‘œ κ³΅κ°œλ˜μ–΄ 있기 λ•Œλ¬Έμ— λˆ„κ΅¬λ“ μ§€ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.

λˆ„κ΅¬λ“  이 곡개 ν‚€λ₯Ό μ‚¬μš©ν•΄μ„œ μ•”ν˜Έν™”ν•œ 데이터λ₯Ό 보내면, λΉ„λ°€ ν‚€λ₯Ό 가진 μ‚¬λžŒλ§Œ κ·Έ λ‚΄μš©μ„ λ³΅ν˜Έν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

보톡 μš”μ²­μ„ λ³΄λ‚΄λŠ” μ‚¬μš©μžκ°€ 곡개 ν‚€λ₯Ό, μš”μ²­μ„ λ°›λŠ” μ„œλ²„κ°€ λΉ„λ°€ ν‚€λ₯Ό κ°€μ§‘λ‹ˆλ‹€. 이 λ•Œ, λΉ„λ°€ ν‚€λŠ” μ„œλ²„κ°€ ν•΄ν‚Ήλ‹Ήν•˜λŠ” 게 μ•„λ‹Œ 이상 νƒˆμ·¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ 곡개 ν‚€ 방식은 곡개 ν‚€λ₯Ό μ‚¬μš©ν•΄ μ•”ν˜Έν™”ν•œ 데이터가 νƒˆμ·¨ λ‹Ήν•œλ‹€κ³  ν•˜λ”λΌλ„, λΉ„λ°€ ν‚€κ°€ μ—†λ‹€λ©΄ λ³΅ν˜Έν™”ν•  수 μ—†μœΌλ―€λ‘œ λŒ€μΉ­ ν‚€ 방식보닀 λ³΄μ•ˆμ„±μ΄ 더 μ’‹μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λŒ€μΉ­ ν‚€ 방식 보닀 더 λ³΅μž‘ν•œ 연산이 ν•„μš”ν•˜μ—¬ 더 λ§Žμ€ μ‹œκ°„μ„ μ†Œλͺ¨ν•œλ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

SSL/TLS ν”„λ‘œν† μ½œ

HTTPSλŠ” HTTP 톡신을 ν•˜λŠ” μ†ŒμΌ“ λΆ€λΆ„μ—μ„œ SSL ν˜Ήμ€ TLSλΌλŠ” ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ μ„œλ²„ 인증과 데이터 μ•”ν˜Έν™”λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ SSL이 ν‘œμ€€ν™”λ˜λ©° 바뀐 이름이 TLSμ΄λ―€λ‘œ 같은 사싀상 같은 ν”„λ‘œν† μ½œμ΄λΌκ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

SSL/TLSλŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ§‘λ‹ˆλ‹€.

  • CAλ₯Ό ν†΅ν•œ μΈμ¦μ„œ μ‚¬μš©
  • λŒ€μΉ­ ν‚€, 곡개 ν‚€ μ•”ν˜Έν™” 방식을 λͺ¨λ‘ μ‚¬μš©

 

μΈμ¦μ„œμ™€ CA(Certificate Authority)

HTTPSλ₯Ό μ‚¬μš©ν•˜λ©΄ λΈŒλΌμš°μ €κ°€ μ„œλ²„μ˜ 응닡과 ν•¨κ»˜ μ „λ‹¬λœ μΈμ¦μ„œλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ μΈμ¦μ„œλŠ” μ„œλ²„μ˜ 신원을 λ³΄μ¦ν•΄μ€λ‹ˆλ‹€.

μ΄λ•Œ μΈμ¦μ„œλ₯Ό λ°œκΈ‰ν•΄μ£ΌλŠ” 곡인된 기관듀을 Certificate Authority, CA라고 λΆ€λ¦…λ‹ˆλ‹€.

 

1. μ„œλ²„λŠ” μΈμ¦μ„œλ₯Ό λ°œκΈ‰λ°›κΈ° μœ„ν•΄μ„œ CA둜 μ„œλ²„μ˜ 정보와 곡개 ν‚€λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

2. CAλŠ” μ„œλ²„μ˜ 곡개 킀와 정보λ₯Ό CA의 λΉ„λ°€ ν‚€λ‘œ μ•”ν˜Έν™”ν•˜μ—¬ μΈμ¦μ„œλ₯Ό λ°œκΈ‰ν•©λ‹ˆλ‹€.

3. μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μš”μ²­μ„ λ°›μœΌλ©΄ CAμ—κ²Œ λ°œκΈ‰λ°›μ€ μΈμ¦μ„œλ₯Ό λ³΄λ‚΄μ€λ‹ˆλ‹€.

4. 이 λ•Œ, μ‚¬μš©μžκ°€ μ‚¬μš©ν•˜λŠ” λΈŒλΌμš°μ €λŠ” CAλ“€μ˜ λ¦¬μŠ€νŠΈμ™€ 곡개 ν‚€λ₯Ό λ‚΄μž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

5. μš°μ„  ν•΄λ‹Ή μΈμ¦μ„œκ°€ λ¦¬μŠ€νŠΈμ— μžˆλŠ” CAκ°€ λ°œκΈ‰ν•œ μΈμ¦μ„œμΈμ§€ ν™•μΈν•˜κ³ , λ¦¬μŠ€νŠΈμ— μžˆλŠ” CA라면 ν•΄λ‹Ήν•˜λŠ” CA의 곡개 ν‚€λ₯Ό μ‚¬μš©ν•΄μ„œ 인증  μ„œμ˜ λ³΅ν˜Έν™”λ₯Ό μ‹œλ„ν•©λ‹ˆλ‹€.

6. CA의 λΉ„λ°€ ν‚€λ‘œ μ•”ν˜Έν™”λœ 데이터(μΈμ¦μ„œ)λŠ” CA의 곡개 ν‚€λ‘œλ§Œ λ³΅ν˜Έν™”κ°€ κ°€λŠ₯ν•˜λ―€λ‘œ, μ •λ§λ‘œ CAμ—μ„œ λ°œκΈ‰ν•œ μΈμ¦μ„œκ°€ λ§žλ‹€λ©΄ λ³΅ν˜Έν™”κ°€ μ„±κ³΅μ μœΌλ‘œ μ§„ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

  • λ³΅ν˜Έν™”κ°€ μ„±κ³΅μ μœΌλ‘œ 진행 λœλ‹€λ©΄, ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ˜ 정보와 곡개 ν‚€λ₯Ό μ–»κ²Œ 됨과 λ™μ‹œμ— ν•΄λ‹Ή μ„œλ²„κ°€ μ‹ λ’°ν•  수 μžˆλŠ” μ„œλ²„μž„μ„ μ•Œ 수 있게 λ©λ‹ˆλ‹€.
  • λ³΅ν˜Έν™”κ°€ μ‹€νŒ¨ν•œλ‹€λ©΄, μ΄λŠ” μ„œλ²„κ°€ 보내쀀 μΈμ¦μ„œκ°€ μ‹ λ’°ν•  수 μ—†λŠ” μΈμ¦μ„œμž„μ„ ν™•μΈν•˜κ²Œ λ©λ‹ˆλ‹€.

 

μ •λ¦¬ν•˜μžλ©΄, μ΄λ ‡κ²Œ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°„μ˜ CAλ₯Ό 톡해 μ„œλ²„λ₯Ό μΈμ¦ν•˜λŠ” κ³Όμ •κ³Ό 데이터λ₯Ό μ•”ν˜Έν™”ν•˜λŠ” 과정을 μ•„μš°λ₯Έ ν”„λ‘œν† μ½œμ„ SSL λ˜λŠ” TLS이라고 λ§ν•˜κ³ , HTTP에 SSL/TLS ν”„λ‘œν† μ½œμ„ λ”ν•œ 것을 HTTPS라고 ν•©λ‹ˆλ‹€.

 

 


 

HTTPS 사섀 μΈμ¦μ„œ λ°œκΈ‰ 및 μ„œλ²„ κ΅¬ν˜„

Homebrewλ₯Ό 톡해 μ„€μΉ˜(macOS)

brew install mkcert

μΈμ¦μ„œ 생성

  1. λ‘œμ»¬μ„ 인증된 λ°œκΈ‰κΈ°κ΄€μœΌλ‘œ μΆ”κ°€
mkcert -install
//λΉ„λ²ˆ -> 컴퓨터 λΉ„λ²ˆ

μ΄λ ‡κ²Œ λœ¬λ‹€!

  1. λ‘œμ»¬ν™˜κ²½μ— λŒ€ν•œ μΈμ¦μ„œ λ§Œλ“€κΈ° → μ•„λž˜ λͺ…λ Ήμ–΄ μž…λ ₯
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에 μ»€λ°‹ν•˜μ§€λ§κ³ , μ•”ν˜Έμ²˜λŸΌ λ‹€λ£¨μ–΄μ•Όν•œλ‹€.

HTTPS μ„œλ²„ μž‘μ„±

node.js ν™˜κ²½μ—μ„œ https λ‚΄μž₯ λͺ¨λ“ˆμ„ μ΄μš©ν•΄μ„œ μž‘μ„± κ°€λŠ₯ν•˜λ‹€.

express.jsλ₯Ό ν†΅ν•΄μ„œ λ§Œλ“€μˆ˜λ„ μžˆλ‹€.

방금 μƒμ„±ν•œ μΈμ¦μ„œ νŒŒμΌλ“€μ„ HTTPS μ„œλ²„μ— μ μš©ν•΄μ£ΌλŠ” μž‘μ—…μ΄ μ„ ν–‰λ˜μ–΄μ•Όν•œλ‹€.

__dirname은 ν˜„μž¬ μ‹€ν–‰ 쀑인 파일 경둜λ₯Ό λ§ν•˜λŠ” κ²ƒμœΌλ‘œ, μ ˆλŒ€κ²½λ‘œλ₯Ό λ„£μ–΄μ£Όλ©΄ λœλ‹€.

λ‘œμ»¬μ€ 인증된 λ°œκΈ‰κΈ°κ΄€μœΌλ‘œ 등둝이 λ˜μ–΄μžˆκ³ , μΈμ¦μ„œλŠ” μ„œλ²„μ™€ 같은 κ²½λ‘œμ— μžˆμ–΄μ•Ό ν•œλ‹€.

 

 

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ν”„λ‘œν† μ½œμ„ μ΄μš©ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€!

console.log(req.body);
  console.log(userInfo);

 

 

express.js 이용

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);

λ§Œμ•½ express.js λ₯Ό μ‚¬μš©ν•˜λŠ” 경우,

λ‹€μŒκ³Ό 같이 https.createServer의 두 번째 νŒŒλΌλ―Έν„°μ— λ“€μ–΄κ°ˆ callback ν•¨μˆ˜λ₯Ό Express λ―Έλ“€μ›¨μ–΄λ‘œ ꡐ체!

 

 

ngrok으둜 터널링도 κ°€λŠ₯ν•˜λ‹€.

HTTP둜 λ§Œλ“€μ–΄μ§„ μ„œλ²„λ₯Ό HTTPS ν”„λ‘œν† μ½œλ‘œ 터널링 ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ΄λΌκ³  함!

 

ngrok - Online in One Line

Zero Trust Add SSO, Mutual TLS, IP Policy, and webhook signature verification.

ngrok.com