[๋„คํŠธ์›Œํฌ] ๐Ÿ”’HTTP์™€ ๐Ÿ”HTTPS

TATAยท2023๋…„ 3์›” 6์ผ
0

๋„คํŠธ์›Œํฌ

๋ชฉ๋ก ๋ณด๊ธฐ
5/8

โ–ท HTTP

ย HTTP ์—ญ์‚ฌย 

๏ผ TCP ๊ธฐ๋ฐ˜ : HTTP/1.1, HTTP/2
๏ผ UDP ๊ธฐ๋ฐ˜ : HTTP/3


ย HTTP ํŠน์ง•ย 

๐Ÿ”’ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๊ตฌ์กฐ
๏ผ Request Response ๊ตฌ์กฐ
๏ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋Œ€๊ธฐ
๏ผ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ์‘๋‹ต

๐Ÿ”’ ๋ฌด์ƒํƒœ ํ”„๋กœํ† ์ฝœ(stateless)
๏ผ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š์Œ
๏ผ ์žฅ์ : ์„œ๋ฒ„ ํ™•์žฅ์„ฑ ๋†’์Œ(์Šค์ผ€์ผ ์•„์›ƒ)
๏ผ ๋‹จ์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ „์†ก

๐Ÿ”’ ๋น„์—ฐ๊ฒฐ์„ฑ(connectionless)
๏ผ ์ตœ์†Œํ•œ์˜ ์ž์›์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์œ ์ง€ ๊ฐ€๋Šฅ
๏ผ ์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ ๋‹จ์œ„ ์ดํ•˜์˜ ๋น ๋ฅธ ์†๋„๋กœ ์‘๋‹ต

ํ•œ๊ณ„์™€ ๊ทน๋ณต
TCP/IP ์—ฐ๊ฒฐ์„ ์ƒˆ๋กœ ๋งบ์–ด์•ผ ํ•จ,
html, css, js, ์ด๋ฏธ์ง€ ๋“ฑ ์ˆ˜ ๋งŽ์€ ์ž์›์ด ํ•จ๊ป˜ ๋‹ค์šด๋กœ๋“œ ๋จ
โ†’ HTTP ์ง€์† ์—ฐ๊ฒฐ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ, HTTP/2์™€ HTTP/3์—์„œ ๋” ๋งŽ์€ ์ตœ์ ํ™”


ย HTTP ํ—ค๋”ย 

HTTP ๋ฉ”์‹œ์ง€๋Š” ํ—ค๋”์™€ ๋ฐ”๋””๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๏ผ Content-Type: ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹
๏ผ Content-Encoding: ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ์••์ถ• ๋ฐฉ์‹
๏ผ Content-Language: ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ์ž์—ฐ ์–ธ์–ด
๏ผ Content-Length: ํ‘œํ˜„ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด


ย ์š”์ฒญ ํ—ค๋”ย 

์š”์ฒญ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”๋“ค

๏ผ From: ์œ ์ € ์—์ด์ „ํŠธ์˜ ์ด๋ฉ”์ผ ์ •๋ณด, ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ž˜ ์‚ฌ์šฉX
๏ผ Referer: ์ด์ „ ์›น ํŽ˜์ด์ง€ ์ฃผ์†Œ
๏ผ User-Agent: ์œ ์ € ์—์ด์ „ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด

<!-- User-Agent ์˜ˆ์‹œ -->
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/
537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36

๏ผ Host: ์š”์ฒญํ•œ ํ˜ธ์ŠคํŠธ ์ •๋ณด(๋„๋ฉ”์ธ), ํ•„์ˆ˜ ํ—ค๋”

<!-- Host๋Š” ์–ธ์ œ ์”€? -->
โ€ข ํ•˜๋‚˜์˜ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ํ˜ธ์ŠคํŠธ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
โ€ข ํ•˜๋‚˜์˜ IP ์ฃผ์†Œ์— ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์ด ์ ์šฉ๋˜์–ด ์žˆ์„ ๋•Œ ํ˜ธ์ŠคํŠธ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

๏ผ Origin: ์„œ๋ฒ„๋กœ POST ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, ์š”์ฒญ์„ ์‹œ์ž‘ํ•œ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋ƒ„
๏ผ Authorization: ์ธ์ฆ ํ† ํฐ(ex. JWT)์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ—ค๋”


ย ์‘๋‹ต ํ—ค๋”ย 

์‘๋‹ต์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”๋“ค

๏ผ Server: ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ORIGIN ์„œ๋ฒ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ •๋ณด

<!-- Server ์˜ˆ์‹œ -->
Server: Apache/2.2.22 (Debian)
Server: nginx

๏ผ Date: ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„

<!-- Date ์˜ˆ์‹œ -->
Date: Tue, 15 Nov 1994 08:12:31 GMT

๏ผ Location: ํŽ˜์ด์ง€ ๋ฆฌ๋””๋ ‰์…˜

<!-- Location -->
์›น ๋ธŒ๋ผ์šฐ์ €๋Š” 3xx ์‘๋‹ต์˜ ๊ฒฐ๊ณผ์— Location ํ—ค๋”๊ฐ€ ์žˆ์œผ๋ฉด, Location ์œ„์น˜๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(์ž๋™ ์ด๋™)
๏ผ 201(Created): Location ๊ฐ’์€ ์š”์ฒญ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค URI
๏ผ 3xx(Redirection): Location ๊ฐ’์€ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด

๏ผ Allow: ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ HTTP ๋ฉ”์„œ๋“œ

<!-- Allow ์˜ˆ์‹œ -->
Allow: GET, HEAD, PUT

๏ผ Retry-After: ์œ ์ € ์—์ด์ „ํŠธ๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์„ ํ•˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„

<!-- Retry-After ์˜ˆ์‹œ -->
Retry-After: Fri, 31 Dec 2020 23:59:59 GMT(๋‚ ์งœ ํ‘œ๊ธฐ)
Retry-After: 120(์ดˆ ๋‹จ์œ„ ํ‘œ๊ธฐ)

โ–ท HTTPS

HTTP Secure

HTTPS๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์œผ๋กœ ์˜ค๊ฐ€๋Š” ๋‚ด์šฉ์„ ์•”ํ˜ธํ™”ํ•œ๋‹ค.
(HTTP์— SSL/TLS ํ”„๋กœํ† ์ฝœ์„ ๋”ํ•œ ๊ฒƒ์„ HTTPS๋ผ๊ณ  ํ•จ)


ย ๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹ย 

ํ•˜๋‚˜์˜ ํ‚ค๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
๊ณต๊ฐœ ํ‚ค ๋ฐฉ์‹์— ๋น„ํ•ด ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ,
ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‹ ๊ฒฝ์„ ๋งŽ์ด ์จ์•ผ ํ•œ๋‹ค.


ย ๊ณต๊ฐœ ํ‚ค(๋น„๋Œ€์นญ ํ‚ค) ์•”ํ˜ธํ™” ๋ฐฉ์‹ย 

๋‘ ๊ฐœ์˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์•”ํ˜ธํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ํ‚ค์™€ ๋‹ค๋ฅธ ํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ณด์•ˆ์„ฑ์ด ์ข‹์ง€๋งŒ, ๋Œ€์นญ ํ‚ค ๋ฐฉ์‹์— ๋น„ํ•ด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.


ย ์ธ์ฆ์„œ์™€ CAย 

Certificate Authority

์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ๊ณต์ธ๋œ ๊ธฐ๊ด€๋“ค์„ CA๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
CA์˜ ๋น„๋ฐ€ ํ‚ค๋กœ ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ(์ธ์ฆ์„œ)๋Š” CA์˜ ๊ณต๊ฐœ ํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋Œ€์นญ ํ‚ค ์ „๋‹ฌ


โ—๏ธ์ฐธ๊ณ ) ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ„์˜ CA๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋ฅผ ์ธ์ฆํ•˜๋Š” ๊ณผ์ •๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๊ณผ์ •์„ ์•„์šฐ๋ฅธ ํ”„๋กœํ† ์ฝœ์„ SSL ๋˜๋Š” TLS๋ผ๊ณ  ํ•œ๋‹ค.


โ–ท mkcert

HTTPS ์‚ฌ์„ค ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๋ฐ ์„œ๋ฒ„ ๊ตฌํ˜„ํ•˜๊ธฐ

๐Ÿ” ์„ค์น˜

brew install mkcert

// firefox๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ•„์š”์— ๋”ฐ๋ผ ์„ค์น˜ํ•˜๊ธฐ
brew install nss

๐Ÿ” ์ธ์ฆ์„œ ์ƒ์„ฑ

// ๋กœ์ปฌ์„ ์ธ์ฆ๋œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์œผ๋กœ ์ถ”๊ฐ€
mkcert -install

// ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ธ์ฆ์„œ ๋งŒ๋“ค๊ธฐ - 127.0.0.1(IPv4), ::1(IPv6)
// key.pem์˜ ๊ฒฝ์šฐ ๊ฐœ์ธ ํ‚ค์ด๋ฏ€๋กœ git์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ , ์•”ํ˜ธ์ฒ˜๋Ÿผ ๋‹ค๋ฃจ์–ด์•ผ ํ•จ
mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

๐Ÿ” HTTPS ์„œ๋ฒ„ ์ž‘์„ฑ

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

ย express ๋ชจ๋“ˆ ์‚ฌ์šฉย 

// npm i express
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);



๐Ÿ‘‰ (wikipedia) List of HTTP header fields - ํ‘œ์ค€ ํ—ค๋”๋“ค
๐Ÿ‘‰ ๐ŸŽฐOSI 7 ๊ณ„์ธต ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

profile
๐Ÿพ

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