Posts ๐Ÿ’ป HTTP #9: HTTP ์ปจํ…์ธ  ํ˜‘์ƒ
Post
Cancel

๐Ÿ’ป HTTP #9: HTTP ์ปจํ…์ธ  ํ˜‘์ƒ

HTTP ์ปจํ…์ธ  ํ˜‘์ƒ

Content Negotiation์ด๋ž€ ๋™์ผํ•œ URI์—์„œ ๋ฆฌ์†Œ์Šค์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ์ผ ์ž˜ ๋งž๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

์›์น™

ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค์˜ URL์„ ์‚ฌ์šฉํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•œ๋‹ค. ์„œ๋ฒ„๋Š” ๋ฆฌ์†Œ์Šฌ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฐ URL์„ ์‚ฌ์šฉํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ ํŠน์ • ํ”„๋ ˆ์  ํ…Œ์ด์…˜(๋ฆฌ์†Œ์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ณ€ํ˜•)์„ ๋ฆฌํ„ดํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค๊ฐ€ URL์„ ํ†ตํ•ด ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ํŠน์ • ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Content Negotiation์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. Content Negotiation์€ ์„œ๋ฒ„ ์ฃผ๋„์™€ ํด๋ผ์ด์–ธํŠธ ์ฃผ๋„๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ํŠน์ • HTTP ํ—ค๋”๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• (์„œ๋ฒ„ ์ฃผ๋„)
  2. ์ „๋‹ฌ๋ฐ›์€ 300, 406 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• (์—์ด์ „ํŠธ ์ฃผ๋„)

img

server-driven content negotiation

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ํŠน์ • HTTP ํ—ค๋”๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ํŠน์ • ์ข…๋ฅ˜์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ‘œ์ค€ ํ˜‘์ƒ ๋ฐฉ๋ฒ•์ด๋‹ค. HTTP/1.1 ํ‘œ์ค€์€ ์„œ๋ฒ„ ์ฃผ๋„ ํ˜‘์ƒ์„ ์‹œ์ž‘ํ•˜๋Š” ํ‘œ์ค€ ํ—ค๋” ๋ชฉ๋ก(Accept, Accept-Charset, Accept-Encoding, Accept-Language)์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

img

์„œ๋ฒ„ ์ฃผ๋„ Content Negotiation์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ์— ๋Œ€ํ•ด ์™„๋ฒฝํžˆ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๊ฐ€ ์„ ํƒํ•œ representation์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ํ•ฉํ•œ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ํ—ค๋”์— ์žˆ๋Š” ์ •๋ณด๋Š” ์‚ฌ์ƒํ™œ ์นจํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • HTTP ํ—ค๋” ์ •๋ณด๋ฅผ ๋ณด๊ณ  ์›๊ฒฉ ์ปดํ“จํ„ฐ์˜ OS, ๋ฒ„์ „, ์‚ฌ์šฉ ์ค‘์ธ ํ”„๋กœํ† ์ฝœ์„ ์•Œ์•„๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๋ฆฌ์†Œ์Šค์˜ ๋ช‡ ๊ฐœ์˜ representation์ด ์ „์†ก๋˜๋ฏ€๋กœ, ์ƒค๋“œ๋œ ์บ์‹œ๋“ค์€ ๋œ ํšจ์œจ์ ์ด๊ณ  ์„œ๋ฒ„ ๊ตฌํ˜„์€ ์ข€ ๋” ๋ณต์žกํ•ด์ง„๋‹ค.

์ƒค๋“œ(shard): ๋‹จ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฐ๋‚ด์–ด ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

Accept ํ—ค๋”

  • ์—์ด์ „ํŠธ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค์˜ ํ’ˆ์งˆ ์ธ์ž์™€ ํ•จ๊ป˜ MIME ํƒ€์ž…์„ ๋‚˜์—ดํ•œ ํ—ค๋”
  • ๋‹ค๋ฅธ MIME ํƒ€์ž… ์‚ฌ์ด์˜ ์ƒ๋Œ€์ ์ธ ์„ ํ˜ธ๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Accept-Charset ํ—ค๋”

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์ „ํ†ต์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์œ„์น˜์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

  • ํ˜„์žฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋“ค์ด Accept-Charset ํ—ค๋”๋ฅผ ์ƒ๋žตํ•˜๊ณ  ์žˆ๋‹ค.
    • UTF-8์˜ ๋ณดํŽธํ™”
    • ๊ฐœ์ธ์ •๋ณด์˜ ๋ณดํ˜ธ(ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ๋œ ๋…ธ์ถœ์‹œํ‚ค๊ธฐ ์œ„ํ•ด)

Accept-Encoding ํ—ค๋”

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” HTTP ์••์ถ• ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • q์ธ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์••์ถ• ๋ฐฉ์‹ ๊ฐ„ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’ identity๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์ด๋‹ค.
  • ์ „์†ก๋˜๋Š” ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ์ด ํ—ค๋”๋ฅผ ํฌํ•จ์‹œ์ผœ ์š”์ฒญํ•œ๋‹ค. ์„œ๋ฒ„๋Š” ์ด์— ๋”ฐ๋ผ ์••์ถ• ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

Accept-Language ํ—ค๋”

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์–ธ์–ด ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • q์ธ์ž๋กœ ์–ธ์–ด ๊ฐ„ ์„ ํ˜ธ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์–ธ์–ด ์„ค์ •๊ฐ’์„ ์ด์šฉํ•ด Accept Language ๊ฐ’์„ ๋ณด๋‚ธ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž์˜ ์‹ค์ œ ์š”๊ตฌ์™€ ์ด ๊ฐ’์€ ๋ถˆ์ผ์น˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์‚ฌ์ดํŠธ์— ์–ธ์–ด ๋ฉ”๋‰ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋“ฑ ์ด์— ๋Œ€๋น„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

User-Agent ํ—ค๋”

  • ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • product tokens์™€ comments๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด์ด๋‹ค.
  • product token: ๋ธŒ๋ผ์šฐ์ €/๋ฒ„์ „
  • comment: ๊ด„ํ˜ธ ์•ˆ์— ์ ํ˜€ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์†ํ•œ ํ˜ธ์ŠคํŠธ์˜ OS ๋“ฑ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.
  • ์ด ํ—ค๋”์— ์˜์ง€ํ•ด ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์›น ํŽ˜์ด์ง€ ๋ฐ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. ์›น์€ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋””๋ฐ”์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ง€์— ๊ฐœ์˜์น˜ ์•Š๊ณ  ๋ชจ๋‘์—๊ฒŒ ์ ‘๊ทผ์ด ์šฉ์ดํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

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

  • Accept-* ํ—ค๋”์™€ ๋‹ฌ๋ฆฌ ์›น ์„œ๋ฒ„ ์‘๋‹ต ํ—ค๋”์ด๋‹ค.

  • ์„œ๋ฒ„ ์ฃผ๋„ ์ปจํ…์ธ  ํ˜‘์ƒ์˜ ๊ณผ์ • ์ค‘์— ์„œ๋ฒ„์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”๋“ค์˜ ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • ์ฆ‰ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ œ์‹œํ•œ ์—ฌ๋Ÿฌ representation ์ค‘์—์„œ ์„œ๋ฒ„๊ฐ€ ์„ ํƒํ•œ ํ—ค๋”๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ค€๋‹ค.
  • ์บ์‹œ๋œ ์‘๋‹ต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
  • Vary: <header-name>, <header-name>

agent-driven content negotiation

  • server-driven content negotiation ๋‹จ์ 
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ ค ํ•˜๋ฉด ๋” ๋งŽ์€ ํ—ค๋”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ๋” ๋งŽ์€ ํ—ค๋”๋Š” ๋Œ€์—ญํญ์˜ ์ฆ๊ฐ€์™€ ๊ฐœ์ธ์ •๋ณด ๋…ธ์ถœ์„ ์•ผ๊ธฐํ•œ๋‹ค.
  • ์ด์— HTTP๋Š” agent-driven content negotiation์„ ์ง€์›ํ•œ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ์• ๋งคํ•œ representation ์กฐ๊ฑด์„ ๋งˆ์ฃผํ–ˆ์„ ๋•Œ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋“ค์˜ URL๋ฅผ ํฌํ•จํ•œ ํŽ˜์ด์ง€(300 multiple choices)๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ์ด์— ์‚ฌ์šฉ์ž๋Š” ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.

img

์—์ด์ „ํŠธ ์ฃผ๋„ ํ˜‘์ƒ์˜ ๋ฌธ์ œ์ 

  • HTTP ํ‘œ์ค€์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค ์ค‘์—์„œ ์„ ํƒํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ํŽ˜์ด์ง€์˜ ํ˜•์‹์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

  • ์‹ค์ œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ํ•œ ๊ฐœ ์ด์ƒ์˜ ์š”์ฒญ์ด ํ•„์š”ํ•ด ๋ฆฌ์†Œ์Šค ํšจ์šฉ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

This post is licensed under CC BY 4.0 by the author.

ํ•™์› #53์ผ์ฐจ: ๊ณ„์‚ฐ๊ธฐ Network App, ์ฑ„ํŒ… App, ์Šค๋ ˆ๋“œ

๋Ÿฌ๋‹ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ #1์žฅ: ์ฒซ ๋ฒˆ์งธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Loading comments from Disqus ...