๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

"HTTP" ํƒœ๊ทธ๋กœ ์—ฐ๊ฒฐ๋œ 2๊ฐœ ๊ฒŒ์‹œ๋ฌผ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํƒœ๊ทธ ๋ณด๊ธฐ

ยท ์•ฝ 3๋ถ„

์ฟ ํ‚ค์™€ ์ธ์ฆ(Auth)#

์ฟ ํ‚ค๋ž€?#

๐Ÿ“Œ ์ƒํƒœ๊ฐ€ ์—†๋Š”(stateless) HTTP ํ”„๋กœํ† ์ฝœ์—์„œ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ 

  • ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ

  • ๋™์ผํ•œ ์„œ๋ฒ„์— ์žฌ ์š”์ฒญ ์‹œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ „์†ก

  • ์ฟ ํ‚ค๋Š” ๋™์ผํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋“ค์–ด์™”๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ (์‚ฌ์šฉ์ž์˜๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€)

๋ชฉ์ #

  • ์„ธ์…˜ ๊ด€๋ฆฌ

    ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ํ•  ๋กœ๊ทธ์ธ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๊ฒŒ์ž„ ์Šค์ฝ”์–ด ๋“ฑ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•จ

  • ๊ฐœ์ธํ™”

    ์‚ฌ์šฉ์ž ์„ ํ˜ธ, ํ…Œ๋งˆ ๋“ฑ์˜ ์„ธํŒ…

  • ํŠธ๋ž˜ํ‚น

    ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๊ธฐ๋กํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ์šฉ๋„

์ฟ ํ‚ค ์ƒ์„ฑํ•˜๊ธฐ#

HTTP ์‘๋‹ต ํ—ค๋”์˜ Set-Cookie key์— ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

function(req, res) {  res.writeHead(200, {    'Set-Cookie': ['yummy_cookie=choco', 'tasty_cookie=strawberry'],  })}

์ฟ ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ#

function(req, res) {  console.log(res.headers.cookie); // ['yummy_cookie=choco', 'tasty_cookie=strawberry']}

Session vs Persistent#

Session Cookie#

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ ๋จ.

session storage๋Š” ๋ธŒ๋ผ์šฐ์ € ํƒญ์ด ์ข…๋ฃŒ๋˜๋ฉด ์‚ญ์ œ๋˜๋Š” ๋ฐ˜๋ฉด, ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ € ํƒญ ๊ฐ„์—๋„ ๊ณต์œ ๋˜์–ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์–ด์•ผ ์‚ญ์ œ๋œ๋‹ค. ์ฐธ์กฐ

Persistent Cookie#

  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•ด๋„ ์‚ฌ์šฉ์ž์˜ ํ•˜๋“œ๋””์Šคํฌ์— ์ €์žฅ.

  • ์‚ญ์ œ ์‹œ๊ธฐ : Max-Age ์†์„ฑ์— ๋ช…์‹œ๋œ ๊ธฐ๊ฐ„ ์ดํ›„์—, ๋˜๋Š” Expires ์†์„ฑ์— ๋ช…์‹œ๋œ๋‚ ์งœ์— ์‚ญ์ œ, ๋˜๋Š” ์ง์ ‘ ์‚ญ์ œ

Secure & HttpOnly#

Secure#

'Set-Cookie': ['hello_secure_cookie=hello-secure; Secure'],

Secure ์ฟ ํ‚ค๋Š” HTTPS ํ”„๋กœํ† ์ฝœ ์ƒ์—์„œ ์•”ํ˜ธํ™”๋œ ์š”์ฒญ์ผ ๊ฒฝ์šฐ์—๋งŒ ์ „์†ก๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ดํ”Œ๋ž˜๊ทธ๊ฐ€ ์‹ค์งˆ์ ์ธ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

HttpOnly#

'Set-Cookie': ['hello_http_only=hello-http; HttpOnly'],

HttpOnly ์ฟ ํ‚ค๋Š” JavaScript์˜ document.cookie API๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ์„œ๋ฒ„์—๊ฒŒ ์ „์†ก๋˜๊ธฐ๋งŒ ํ•œ๋‹ค.

Path & Domain#

path#

path=/subpath ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์š”์ฒญ๋˜๋Š” URL ๋‚ด์— ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•˜๋Š” URL ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

domain#

'Set-Cookie': ['hello_domain=hello-domain; Domain=o2.org'],

์ด๋ ‡๊ฒŒ ์ง€์ •ํ•˜๋ฉด subdomain.o2.org ๋“ฑ๋“ฑ์˜ ๋ชจ๋“  ์„œ๋ธŒ ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ๋„ ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.

ยท ์•ฝ 2๋ถ„

HTTP#

HyperText Transfer Protocol


2020-07-11-200711-image-0


2020-07-11-200711-image-1

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ HTML ํŒŒ์ผ์„ ์š”์ฒญ(Request), ์„œ๋ฒ„๋Š” ์‘๋‹ต(Response)

Request Message#

  • GET /1.html HTTP/1.1 => ์š”์ฒญํ–‰

  • Host: localhost:8080 => ๋„คํŠธ์›Œํฌ์˜ ์ปดํ“จํ„ฐ ์‹๋ณ„ํ•˜๋Š” ์ด๋ฆ„

  • User-Agent : ... => ์œ ์ € ์ปดํ“จํ„ฐ, ์›น๋ธŒ๋ผ์šฐ์ € ์ •๋ณด

  • Accept-Encoding : gzip, deflate, br => ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ์œผ๋ฉด ์••์ถ•ํ•ด์„œ ์ „์†กํ•˜๋Š”๋ฐ, ์–ด๋–ค ์••์ถ•๋ฐฉ์‹์„ ์ง€์›ํ•˜๋Š”์ง€ ์„ค๋ช…

  • If-Modified-Since: => ๋งˆ์ง€๋ง‰์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์šด๋ฐ›์€๊ฒŒ ์–ธ์ œ์ธ์ง€ ํ™•์ธํ•˜์—ฌ ๋‹ค์‹œ ๋‹ค์šด๋ฐ›์„์ง€ ๊ฒฐ์ •

  • <blank line> => ๋ธ”๋žญํฌ๋กœ ํ—ค๋”์™€ ๋ฐ”๋”” ๊ตฌ๋ถ„

  • Request Message Body

Response Message#

2020-07-11-200711-image-2

  • status : ์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์คŒ.


๊ทธ ์™ธ#

  • HTTPS, SSL

  • Cache

  • cookie

  • web storage

  • proxy