Web

[HTTP] HTTP Content Negotiation: ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๋Œ€ํ™” ๊ธฐ์ˆ  ๐Ÿ—ฃ๏ธ

xeunnie 2025. 1. 12. 01:00
728x90
๋ฐ˜์‘ํ˜•

HTTP Content Negotiation ํ†บ์•„๋ณด๊ธฐ ๐Ÿ—ฃ๏ธ

์›น์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ฐ€๋Š” ๊ณผ์ •์€ ๋งˆ์น˜ “๋ฉ”๋‰ดํŒ์„ ๋ณด๊ณ  ์š”๋ฆฌ๋ฅผ ์ฃผ๋ฌธํ•˜๋Š” ์†๋‹˜๊ณผ ์…ฐํ”„” ๊ฐ™์€ ๋Œ€ํ™”๋กœ ์ด๋ฃจ์–ด์ ธ์š”. ํด๋ผ์ด์–ธํŠธ(์†๋‹˜)๋Š” ์ž์‹ ์ด ์–ด๋–ค ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š”์ง€ “์š”์ฒญ”ํ•˜๊ณ , ์„œ๋ฒ„(์…ฐํ”„)๋Š” ๊ทธ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ “์‘๋‹ต”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋Œ€ํ™” ๊ณผ์ •์„ HTTP์—์„œ๋Š” Content Negotiation(์ฝ˜ํ…์ธ  ํ˜‘์ƒ)์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ์š”. ๐Ÿง‘‍๐Ÿณ


 ๐Ÿฝ๏ธ Content Negotiation์ด๋ž€?

Content Negotiation์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ ํ˜•์‹๊ณผ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์กฐ์œจํ•˜๋Š” HTTP ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด์—์š”.

์ฆ‰, ํด๋ผ์ด์–ธํŠธ๊ฐ€ “JSON์œผ๋กœ ์ฃผ์„ธ์š”!“๋ผ๊ณ  ์š”์ฒญํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ๊ทธ์— ๋งž๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์ฃ .

์™œ ํ•„์š”ํ• ๊นŒ?

  1. ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ ์ง€์›: ๋ธŒ๋ผ์šฐ์ €, ๋ชจ๋ฐ”์ผ ์•ฑ, IoT ๊ธฐ๊ธฐ ๋“ฑ ์š”์ฒญํ•˜๋Š” ํ™˜๊ฒฝ์ด ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ
  2. ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ „์†กํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”
  3. ๋‹ค๊ตญ์–ด ์ง€์›: ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด ์„ค์ •์— ๋”ฐ๋ผ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ œ๊ณต.

๐Ÿ› ๏ธ Content Negotiation์˜ ์ž‘๋™ ๋ฐฉ์‹

ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ์š”์ฒญ ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์„ ํ˜ธํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์„œ๋ฒ„๋Š” ์ด๋ฅผ ํ•ด์„ํ•ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงพ ์ฃผ์š” HTTP ํ—ค๋”๋“ค

1๏ธโƒฃ Accept

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›๊ณ  ์‹ถ์€ ๋ฏธ๋””์–ด ํƒ€์ž…(ex: text/html, application/json)์„ ์ง€์ •.

Accept: application/json, text/html

 

2๏ธโƒฃ Accept-Language

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์–ธ์–ด๋ฅผ ์ง€์ •

Accept-Language: en-US, fr;q=0.8, ko;q=0.6

 

์—ฌ๊ธฐ์„œ q๋Š” ํ’ˆ์งˆ ์ง€์ˆ˜๋กœ, ์„ ํ˜ธ๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (1.0์ด ๊ฐ€์žฅ ๋†’๊ณ , 0.0์€ ์•„์˜ˆ ์ง€์›ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธ)

 

3๏ธโƒฃ Accept-Encoding

๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•  ์••์ถ• ๋ฐฉ์‹์„ ์ง€์ •.

Accept-Encoding: gzip, deflate, br

 

4๏ธโƒฃ User-Agent

ํด๋ผ์ด์–ธํŠธ์˜ ๋””๋ฐ”์ด์Šค ์ •๋ณด(๋ธŒ๋ผ์šฐ์ €, OS ๋“ฑ)๋ฅผ ํฌํ•จ.

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)

Content Negotiation์˜ ์ข…๋ฅ˜ ๐ŸŒ

1. ์„œ๋ฒ„ ์ฃผ๋„ ํ˜‘์ƒ(Server-Driven Negotiation)

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ํ—ค๋”๋ฅผ ๋ณด๊ณ  ์ž๋™์œผ๋กœ ์ตœ์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹

  • ์žฅ์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ„๋‹จํžˆ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ
  • ๋‹จ์ : ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์„ ํ˜ธ๋„๋ฅผ 100% ์•Œ๊ธฐ ์–ด๋ ต๊ณ , ์‘๋‹ต ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ
GET /resource HTTP/1.1
Host: example.com
Accept: application/json, text/html

 

์„œ๋ฒ„ ์‘๋‹ต ์˜ˆ์‹œ:

HTTP/1.1 200 OK
Content-Type: application/json

 

2. ํด๋ผ์ด์–ธํŠธ ์ฃผ๋„ ํ˜‘์ƒ(Client-Driven Negotiation)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ์‹œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹

  • ์žฅ์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ •ํ™•ํžˆ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
  • ๋‹จ์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋“  ์˜ต์…˜์„ ์•Œ์•„์•ผ ํ•จ
GET /resource.json HTTP/1.1
Host: example.com

 

์„œ๋ฒ„ ์‘๋‹ต ์˜ˆ์‹œ:

HTTP/1.1 200 OK
Content-Type: application/json

 

3. ํˆฌ๋ช… ํ˜‘์ƒ(Transparent Negotiation)

์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ˜‘๋ ฅํ•˜์—ฌ ์ตœ์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ˜‘์ƒ์ด ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ๋กœ, ์‹ค์ œ๋กœ๋Š” ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์š”.


๐Ÿ’ป ์‹ค๋ฌด์—์„œ์˜ Content Negotiation ์˜ˆ์ œ

1๏ธโƒฃ JSON vs HTML

REST API ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ JSON ๋ฐ์ดํ„ฐ ๋˜๋Š” HTML์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

 

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ:

GET /users HTTP/1.1
Accept: application/json, text/html

 

์„œ๋ฒ„ ์‘๋‹ต (JSON):

HTTP/1.1 200 OK
Content-Type: application/json

{
  "users": [
    { "id": 1, "name": "Alice" },
    { "id": 2, "name": "Bob" }
  ]
}

 

2๏ธโƒฃ ์–ธ์–ด์— ๋”ฐ๋ฅธ ์ฝ˜ํ…์ธ  ์ œ๊ณต

๋‹ค๊ตญ์–ด ์ง€์› ์›น์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด์— ๋งž๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณต.

 

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ:

GET /home HTTP/1.1
Accept-Language: fr, en;q=0.8, es;q=0.6

 

์„œ๋ฒ„ ์‘๋‹ต (ํ”„๋ž‘์Šค์–ด ์ฝ˜ํ…์ธ ):

HTTP/1.1 200 OK
Content-Language: fr

<!DOCTYPE html>
<html lang="fr">
<head><title>Bienvenue</title></head>
<body><h1>Bienvenue sur notre site!</h1></body>
</html>

โš ๏ธ Content Negotiation์˜ ํ•œ๊ณ„์™€ ์ฃผ์˜์‚ฌํ•ญ

1๏ธโƒฃ ์„œ๋ฒ„ ์ฃผ๋„ ํ˜‘์ƒ์˜ ๋ถˆํ™•์‹ค์„ฑ

ํด๋ผ์ด์–ธํŠธ์˜ ์„ ํ˜ธ๋„๋ฅผ 100% ๋งŒ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ.

 

2๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ ์ฃผ๋„ ํ˜‘์ƒ์˜ ๋ณต์žก์„ฑ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ช…ํ™•ํžˆ ์š”์ฒญํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ชจ๋“  ์˜ต์…˜์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•จ.

 

3๏ธโƒฃ ์บ์‹ฑ ๋ฌธ์ œ

์„œ๋กœ ๋‹ค๋ฅธ ํ—ค๋”๋กœ ์š”์ฒญํ•œ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•  ๋•Œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด Vary ํ—ค๋”๋ฅผ ์‚ฌ์šฉ.

Vary: Accept, Accept-Language

๐Ÿค” Content Negotiation์€ ์™œ ์ค‘์š”ํ• ๊นŒ? 

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ : ๊ฐ ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ๊ณผ ์„ ํ˜ธ๋„์— ๋งž๋Š” ์ฝ˜ํ…์ธ  ์ œ๊ณต
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ํšจ์œจ์ ์œผ๋กœ ์ „์†ก
  • SEO์™€ ์ ‘๊ทผ์„ฑ ๊ฐ•ํ™”: ๊ฒ€์ƒ‰ ์—”์ง„๊ณผ ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์— ๋Œ€์‘.

Content Negotiation์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋Œ€ํ™”๋ฅผ ํ›จ์”ฌ ์Šค๋งˆํŠธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ผญ ๋งž๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฑด ๊ธฐ๋ณธ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ’ˆ์งˆ์„ ํ•œ ๋‹จ๊ณ„ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿš€

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น!๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•