๏ผ TCP ๊ธฐ๋ฐ : HTTP/1.1, HTTP/2
๏ผ UDP ๊ธฐ๋ฐ : HTTP/3
๐ ํด๋ผ์ด์ธํธ ์๋ฒ ๊ตฌ์กฐ
๏ผ Request Response ๊ตฌ์กฐ
๏ผ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋๊ธฐ
๏ผ ์๋ฒ๊ฐ ์์ฒญ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด ์๋ต
๐ ๋ฌด์ํ ํ๋กํ ์ฝ(stateless)
๏ผ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ๋ณด์กดํ์ง ์์
๏ผ ์ฅ์ : ์๋ฒ ํ์ฅ์ฑ ๋์(์ค์ผ์ผ ์์)
๏ผ ๋จ์ : ํด๋ผ์ด์ธํธ๊ฐ ์ถ๊ฐ ๋ฐ์ดํฐ ์ ์ก
๐ ๋น์ฐ๊ฒฐ์ฑ(connectionless)
๏ผ ์ต์ํ์ ์์์ผ๋ก ์๋ฒ๋ฅผ ์ ์ง ๊ฐ๋ฅ
๏ผ ์ผ๋ฐ์ ์ผ๋ก ์ด ๋จ์ ์ดํ์ ๋น ๋ฅธ ์๋๋ก ์๋ต
ํ๊ณ์ ๊ทน๋ณต
TCP/IP ์ฐ๊ฒฐ์ ์๋ก ๋งบ์ด์ผ ํจ,
html, css, js, ์ด๋ฏธ์ง ๋ฑ ์ ๋ง์ ์์์ด ํจ๊ป ๋ค์ด๋ก๋ ๋จ
โ HTTP ์ง์ ์ฐ๊ฒฐ๋ก ๋ฌธ์ ํด๊ฒฐ, HTTP/2์ HTTP/3์์ ๋ ๋ง์ ์ต์ ํ
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(์ด ๋จ์ ํ๊ธฐ)
HTTP Secure
HTTPS๋ ์์ฒญ๊ณผ ์๋ต์ผ๋ก ์ค๊ฐ๋ ๋ด์ฉ์ ์ํธํํ๋ค.
(HTTP์ SSL/TLS ํ๋กํ ์ฝ์ ๋ํ ๊ฒ์ HTTPS๋ผ๊ณ ํจ)
ํ๋์ ํค๋ง ์ฌ์ฉํ๋ค.
๊ณต๊ฐ ํค ๋ฐฉ์์ ๋นํด ์ฐ์ฐ ์๋๊ฐ ๋น ๋ฅด์ง๋ง,
ํค๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ์ ๊ฒฝ์ ๋ง์ด ์จ์ผ ํ๋ค.
๋ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํ๋ค.
์ํธํํ ๋ ์ฌ์ฉํ ํค์ ๋ค๋ฅธ ํค๋ก๋ง ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ณด์์ฑ์ด ์ข์ง๋ง, ๋์นญ ํค ๋ฐฉ์์ ๋นํด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
Certificate Authority
์ธ์ฆ์๋ฅผ ๋ฐ๊ธํด์ฃผ๋ ๊ณต์ธ๋ ๊ธฐ๊ด๋ค์ CA๋ผ๊ณ ๋ถ๋ฅธ๋ค.
CA์ ๋น๋ฐ ํค๋ก ์ํธํ๋ ๋ฐ์ดํฐ(์ธ์ฆ์)๋ CA์ ๊ณต๊ฐ ํค๋ก๋ง ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ๋ค.
๋์นญ ํค ์ ๋ฌ
โ๏ธ์ฐธ๊ณ ) ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ์ CA๋ฅผ ํตํด ์๋ฒ๋ฅผ ์ธ์ฆํ๋ ๊ณผ์ ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ ๊ณผ์ ์ ์์ฐ๋ฅธ ํ๋กํ ์ฝ์ SSL ๋๋ TLS๋ผ๊ณ ํ๋ค.
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
ย 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 ๊ณ์ธต ๋ณด๋ฌ๊ฐ๊ธฐ