์ธํ„ฐ๋„ท ์—”์ง€๋‹ˆ์–ด๋ง ํƒœ์Šคํฌ ํฌ์Šค (IETF) J. Reschke
์˜๊ฒฌ ์š”์ฒญ ๋ฌธ์„œ: 10008 greenbytes
๋ถ„๋ฅ˜: ํ‘œ์ค€ํ™” ๊ณผ์ • J. Snell
ISSN: 2070-1721 Cloudflare
M. Bishop
Akamai
2026๋…„ 6์›”

HTTP QUERY ๋ฉ”์„œ๋“œ


์ดˆ๋ก

์ด ๋ช…์„ธ๋Š” HTTP์˜ QUERY ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. QUERY๋Š” ์š”์ฒญ ๋Œ€์ƒ์ด ๋™๋ด‰๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๋ฉฑ๋“ฑ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ๊ทธ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋กœ ์‘๋‹ตํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” POST ์š”์ฒญ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, QUERY ์š”์ฒญ์€ ๋ถ€๋ถ„์ ์ธ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์—ผ๋ คํ•˜์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”๋ชจ์˜ ์ƒํƒœ

์ด ๋ฌธ์„œ๋Š” ์ธํ„ฐ๋„ท ํ‘œ์ค€ํ™” ๊ณผ์ • ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” ์ธํ„ฐ๋„ท ์—”์ง€๋‹ˆ์–ด๋ง ํƒœ์Šคํฌ ํฌ์Šค(IETF)์˜ ๊ฒฐ๊ณผ๋ฌผ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” IETF ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํ•ฉ์˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์œผ๋ฉฐ ์ธํ„ฐ๋„ท ์—”์ง€๋‹ˆ์–ด๋ง ์šด์˜ ๊ทธ๋ฃน(IESG)์˜ ๋ฐœํ–‰ ์Šน์ธ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ํ‘œ์ค€์— ๊ด€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” RFC 7841์˜ 2์ ˆ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์˜ ํ˜„์žฌ ์ƒํƒœ, ์ •์˜คํ‘œ ๋ฐ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ์ •๋ณด๋Š” https://www.rfc-editor.org/info/rfc10008์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Copyright Notice

Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.


1. ์†Œ๊ฐœ

์ด ๋ช…์„ธ๋Š” HTTP QUERY ์š”์ฒญ ๋ฉ”์„œ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๋ฉฑ๋“ฑ์ ์ธ ์š”์ฒญ(9.2์ ˆ, [HTTP])์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ˆ˜๋‹จ์œผ๋กœ ์ •์˜ํ•˜๋ฉฐ, ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ์ˆ ํ•˜๋Š” ํ‘œํ˜„์„ ๋™๋ด‰ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ฟผ๋ฆฌ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

GET /feed?q=foo&limit=10&sort=-published HTTP/1.1
Host: example.org

๊ทธ๋Ÿฌ๋‚˜ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋„ˆ๋ฌด ๋งŽ์•„ ์š”์ฒญ URI์— ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ์ด ํŒจํ„ด์—๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค:

  • ์š”์ฒญ์ด ์„œ๋กœ ์กฐ์œจ๋˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์„ ๊ฑฐ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฌ๊ธฐ ์ œํ•œ์„ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค(๋‹ค๋งŒ 4.1์ ˆ, [HTTP]์—์„œ๋Š” ์†ก์‹ ์ž์™€ ์ˆ˜์‹ ์ž๊ฐ€ ์ตœ์†Œ 8000์˜ฅํ…Ÿ์„ ์ง€์›ํ•˜๋„๋ก ๊ถŒ๊ณ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค),
  • ํŠน์ • ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ URI์— ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์œ ํšจํ•œ URI๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋ถ€๊ฐ€ ๋น„์šฉ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค,
  • ์š”์ฒญ URI๋Š” ์š”์ฒญ ์ฝ˜ํ…์ธ ๋ณด๋‹ค ๋กœ๊ทธ์— ๊ธฐ๋ก๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฉฐ ๋ถ๋งˆํฌ์—๋„ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค,
  • ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญ URI์— ์ง์ ‘ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ฟผ๋ฆฌ ์ž…๋ ฅ ์กฐํ•ฉ์„ ์‚ฌ์‹ค์ƒ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋กœ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

GET ์‚ฌ์šฉ์˜ ๋Œ€์•ˆ์œผ๋กœ, ๋งŽ์€ ๊ตฌํ˜„์—์„œ๋Š” HTTP POST ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์•„๋ž˜ ์˜ˆ์ œ์—์„œ ์ด๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์˜ ์ž…๋ ฅ์€ ์š”์ฒญ URI์˜ ์ฟผ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์š”์ฒญ ์ฝ˜ํ…์ธ ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ HTTP POST ์‚ฌ์šฉ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

POST /feed HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded

q=foo&limit=10&sort=-published

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ณ€ํ˜•์—์„œ๋Š” -- ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋Œ€์ƒ์ธ ๋ฆฌ์†Œ์Šค์™€ ์„œ๋ฒ„์— ๊ด€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ง€์‹ ์—†์ด๋Š” -- ์•ˆ์ „ํ•˜๊ณ  ๋ฉฑ๋“ฑ์ ์ธ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

QUERY ๋ฉ”์„œ๋“œ๋Š” GET๊ณผ POST ์‚ฌ์šฉ ์‚ฌ์ด์˜ ๊ฐ„๊ทน์„ ๋ฉ”์šฐ๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์ œ๊ณตํ•˜๋ฉฐ, ์œ„ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค:

QUERY /feed HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded

q=foo&limit=10&sort=-published

POST์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์˜ ์ž…๋ ฅ์€ ์š”์ฒญ URI์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ์š”์ฒญ ์ฝ˜ํ…์ธ ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ POST์™€ ๋‹ฌ๋ฆฌ ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์•ˆ์ „ํ•˜๊ณ  ๋ฉฑ๋“ฑ์ ์ด๋ฏ€๋กœ ์บ์‹ฑ์ด๋‚˜ ์ž๋™ ์žฌ์‹œ๋„ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” URI๋กœ ์‹๋ณ„๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์„ค๊ณ„ ์›์น™์„ ๊ณ ๋ คํ•˜์—ฌ, ์ด ๋ช…์„ธ๋Š” ์„œ๋ฒ„๊ฐ€ ์ฟผ๋ฆฌ ์ž์ฒด ๋˜๋Š” ํŠน์ • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— URI๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๋‚˜์ค‘์— GET ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

ํ‘œ 1: ๊ด€๋ จ ๋ฉ”์„œ๋“œ ์†์„ฑ ์š”์•ฝ
GET QUERY POST
์•ˆ์ „ํ•จ ์˜ˆ ์˜ˆ ์•„๋‹ ์ˆ˜ ์žˆ์Œ
๋ฉฑ๋“ฑ์ ์ž„ ์˜ˆ ์˜ˆ ์•„๋‹ ์ˆ˜ ์žˆ์Œ
์ฟผ๋ฆฌ ์ž์ฒด์˜ URI ์˜ˆ (์ •์˜์ƒ) ์„ ํƒ ์‚ฌํ•ญ (Location ์‘๋‹ต ํ•„๋“œ) ์•„๋‹ˆ์š”
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ URI ์„ ํƒ ์‚ฌํ•ญ (Content-Location ์‘๋‹ต ํ•„๋“œ) ์„ ํƒ ์‚ฌํ•ญ (Content-Location ์‘๋‹ต ํ•„๋“œ) ์„ ํƒ ์‚ฌํ•ญ (Content-Location ์‘๋‹ต ํ•„๋“œ)
์บ์‹œ ๊ฐ€๋Šฅ ์˜ˆ ์˜ˆ ์˜ˆ, ๋‹จ ์ดํ›„์˜ GET ๋˜๋Š” HEAD ์š”์ฒญ์—๋งŒ ํ•ด๋‹น
์ฝ˜ํ…์ธ  (๋ณธ๋ฌธ) "์ •์˜๋œ ์˜๋ฏธ๋ก  ์—†์Œ" ์˜ˆ์ƒ๋จ (์˜๋ฏธ๋ก ์€ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋”ฐ๋ฆ„) ์˜ˆ์ƒ๋จ (์˜๋ฏธ๋ก ์€ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋”ฐ๋ฆ„)

1.1. ์šฉ์–ด

์ด ๋ฌธ์„œ๋Š” ๋‹ค์Œ์— ์ •์˜๋œ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: 3์ ˆ, [HTTP].

๋˜ํ•œ URI ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๋Š” ์šฉ์–ด๋ฅผ URI์˜ ์ฟผ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ์— ์žˆ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜(4.2.2์ ˆ, [HTTP])์— ์‚ฌ์šฉํ•˜๊ณ , ์ฟผ๋ฆฌ ์ฝ˜ํ…์ธ ๋ผ๋Š” ์šฉ์–ด๋ฅผ ์š”์ฒญ ์ฝ˜ํ…์ธ (6.4์ ˆ, [HTTP]), ์ฆ‰ QUERY ์š”์ฒญ์˜ ์ฝ˜ํ…์ธ ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1.2. ํ‘œ๊ธฐ ๊ทœ์น™

ํ•ต์‹ฌ ๋‹จ์–ด "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" ๋ฐ "OPTIONAL"์€ ์ด ๋ฌธ์„œ์—์„œ ๋‹ค์Œ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ํ•ด์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: BCP 14 [RFC2119] [RFC8174]. ๋‹จ, ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.


2. QUERY ๋ฉ”์„œ๋“œ

QUERY ๋ฉ”์„œ๋“œ๋Š” ์„œ๋ฒ„ ์ธก ์ฟผ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ URI๋กœ ์‹๋ณ„๋˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ํ‘œํ˜„์„ ์š”์ฒญํ•˜๋Š” GET ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ(๋‹ค์Œ์— ์ •์˜๋จ: 7.1์ ˆ, [HTTP]), QUERY ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ํ•ด๋‹น ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์š”์ฒญ ์ฝ˜ํ…์ธ ์™€ ๊ทธ ๋ฏธ๋””์–ด ์œ ํ˜•์ด ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์›๋ณธ ์„œ๋ฒ„๋Š” ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ์‚ฐ์˜ ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„๋Š” ๋ฐ˜๋“œ์‹œ ์š”์ฒญ์„ ์‹คํŒจ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Content-Type ์š”์ฒญ ํ•„๋“œ๊ฐ€ ([HTTP], 8.3์ ˆ) ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์š”์ฒญ ์ฝ˜ํ…์ธ ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  HTTP ๋ฉ”์„œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋Œ€์ƒ URI์˜ ์ฟผ๋ฆฌ ๋ถ€๋ถ„์€ ์ฟผ๋ฆฌ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๊ด€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ์ง์ ‘ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ทธ ๋ฐฉ์‹์€ ๋ฆฌ์†Œ์Šค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ ์ด ๋ช…์„ธ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

QUERY ์š”์ฒญ์€ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค ([HTTP], 9.2.1์ ˆ). ์ฆ‰, ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ๋ณ€๊ฒฝ๋„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ HTTP ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ธˆ์ง€๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค (2.3์ ˆ ๋ฐ 2.4์ ˆ ์ฐธ์กฐ).

๋˜ํ•œ QUERY ์š”์ฒญ์€ ๋ฉฑ๋“ฑ์ ์ž…๋‹ˆ๋‹ค ([HTTP], 9.2.2์ ˆ). ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฐ๊ฒฐ ์‹คํŒจ ํ›„์™€ ๊ฐ™์ด ํ•„์š”ํ•  ๋•Œ ์žฌ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๋”ฐ๋ผ, 15.3์ ˆ, [HTTP], 2xx (์„ฑ๊ณต) ์‘๋‹ต ์ฝ”๋“œ๋Š” ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜์‹ ๋˜๊ณ  ์ดํ•ด๋˜์–ด ์ˆ˜๋ฝ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํŠนํžˆ 200 (OK) ์‘๋‹ต์€ ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์œผ๋ฉฐ ๊ทธ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์‘๋‹ต ์ฝ˜ํ…์ธ ๋กœ ๋™๋ด‰๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

2.1. ๋ฏธ๋””์–ด ์œ ํ˜• ๋ฐ ์ฝ˜ํ…์ธ  ํ˜‘์ƒ

QUERY ์š”์ฒญ์˜ ์˜๋ฏธ๋ก ์€ ์š”์ฒญ ์ฝ˜ํ…์ธ ์™€ ๋ฏธ๋””์–ด ์œ ํ˜• ๊ฐ™์€ ๊ด€๋ จ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ชจ๋‘์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค ([HTTP], 8.3.1์ ˆ). ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ˜ํ…์ธ ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์˜ ๋ฌธ์ œ๋Š” ๋ฐ˜๋“œ์‹œ 4xx (ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜) ์‘๋‹ต์œผ๋กœ ๊ฑฐ๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ([HTTP], 15.5์ ˆ).

์•„๋ž˜ ๋ชฉ๋ก์€ ์—ฌ๋Ÿฌ ์‹คํŒจ ์‚ฌ๋ก€๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค:

  • ์š”์ฒญ์— ๋ฏธ๋””์–ด ์œ ํ˜• ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ์ •์˜์ƒ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์œผ๋ฉฐ 400 (ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜) ๊ฐ™์€ 4xx ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฏธ๋””์–ด ์œ ํ˜•์ด ์ง€์ •๋˜์—ˆ์ง€๋งŒ ๋ฆฌ์†Œ์Šค์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” 415 (์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฏธ๋””์–ด ์œ ํ˜•)๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŠนํžˆ ๋ฏธ๋””์–ด ์œ ํ˜• ์ž์ฒด๋Š” ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ QUERY์— ํŠนํ™”๋œ ์˜๋ฏธ๋ก ์ด ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ Accept-Query ์‘๋‹ต ํ•„๋“œ(3์ ˆ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ง€์›๋˜๋Š” ๋ฏธ๋””์–ด ์œ ํ˜•์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฏธ๋””์–ด ์œ ํ˜•์ด ์ง€์ •๋˜์—ˆ์ง€๋งŒ ์‹ค์ œ ์š”์ฒญ ์ฝ˜ํ…์ธ ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” 400 (์ž˜๋ชป๋œ ์š”์ฒญ)์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์„œ๋ฒ„๋Š” ์š”์ฒญ ์ฝ˜ํ…์ธ ์—์„œ ๋ฏธ๋””์–ด ์œ ํ˜•์„ ์ถ”๋ก ํ•œ ๋‹ค์Œ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ "์ž˜๋ชป๋œ" ๊ฐ’์„ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ฆ‰, "์ฝ˜ํ…์ธ  ์Šค๋‹ˆํ•‘").
  • ๋ฏธ๋””์–ด ์œ ํ˜•์ด ์ง€์ •๋˜์–ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ์ฝ˜ํ…์ธ ๊ฐ€ ์‹ค์ œ๋กœ ํ•ด๋‹น ์œ ํ˜•๊ณผ ์ผ์น˜ํ•˜์ง€๋งŒ, ์ฟผ๋ฆฌ์˜ ์‹ค์ œ ๋‚ด์šฉ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด 422 (์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์ฝ˜ํ…์ธ ) ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”์„ ์‹๋ณ„ํ•˜๋Š”, ๊ตฌ๋ฌธ์ƒ ์˜ฌ๋ฐ”๋ฅธ SQL ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ Accept ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์‘๋‹ต ๋ฏธ๋””์–ด ์œ ํ˜•์„ ์š”์ฒญํ–ˆ์ง€๋งŒ ([HTTP], 12.5.1์ ˆ), ๋ฆฌ์†Œ์Šค์—์„œ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” 406 (์ˆ˜์šฉํ•  ์ˆ˜ ์—†์Œ) ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

2.2. ๋™๋“ฑ ๋ฆฌ์†Œ์Šค

์ฃผ์–ด์ง„ QUERY ์š”์ฒญ์˜ ๋™๋“ฑ ๋ฆฌ์†Œ์Šค๋Š” GET ์š”์ฒญ์— ์‘๋‹ตํ•˜๊ณ , ํ•ด๋‹น QUERY ์š”์ฒญ๊ณผ ๊ทธ ๋Œ€์ƒ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฉ”์‹œ์ง€ ์ฝ˜ํ…์ธ ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ชจ๋‘๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค (6์ ˆ, [HTTP]). ํŠนํžˆ ์—ฌ๊ธฐ์—๋Š” ํ‘œํ˜„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(8์ ˆ, [HTTP]), ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ˜ํ…์ธ ์˜ ๋ฏธ๋””์–ด ์œ ํ˜•์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋™๋“ฑ ๋ฆฌ์†Œ์Šค๋Š” QUERY๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์—์„œ ์š”์ฒญ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋™๋“ฑ ๋ฆฌ์†Œ์Šค๋ผ๋Š” ์šฉ์–ด๋Š” ์„ ํƒ๋œ ํ‘œํ˜„ ๊ฐ™์€ ๋‹ค๋ฅธ HTTP ์ธก๋ฉด์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค์— URI๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ• ๋‹นํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค (1.1์ ˆ, [URI] ์ฐธ์กฐ). URI๋ฅผ ํ• ๋‹นํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค์— GET ์š”์ฒญ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2.3. Content-Location ์‘๋‹ต ํ•„๋“œ

์„ฑ๊ณต ์‘๋‹ต(2xx, 15.3์ ˆ, [HTTP])์—๋Š” ์—ฐ์‚ฐ ๊ฒฐ๊ณผ์— ํ•ด๋‹นํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ์‹๋ณ„์ž๊ฐ€ ๋‹ด๊ธด Content-Location ํ—ค๋” ํ•„๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ 8.7์ ˆ, [HTTP]๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ‘œ์‹œ๋œ URI์— GET ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐฉ๊ธˆ ์ˆ˜ํ–‰๋œ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์„œ๋ฒ„์˜ ์ฃผ์žฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ‘œ์‹œ๋œ ๋ฆฌ์†Œ์Šค๋Š” ์ž„์‹œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ก A.4.1์—์„œ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2.4. Location ์‘๋‹ต ํ•„๋“œ

์„œ๋ฒ„๋Š” QUERY ์š”์ฒญ์˜ ๋™๋“ฑ ๋ฆฌ์†Œ์Šค(2.2์ ˆ)์— URI๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ 2xx ์‘๋‹ต์˜ Location ํ—ค๋” ํ•„๋“œ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‹ค์Œ ์ฐธ์กฐ: 10.2.2์ ˆ, [HTTP]). ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ‘œ์‹œ๋œ URI์— GET ์š”์ฒญ์„ ๋ณด๋‚ด ์ฟผ๋ฆฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค์‹œ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ๋ฐฉ๊ธˆ ์ˆ˜ํ–‰๋œ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ์ด ๋ฆฌ์†Œ์Šค์˜ URI๋Š” ์ž„์‹œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์›๋ž˜ QUERY ์š”์ฒญ ๋Œ€์ƒ๊ณผ ์ด์ „์— ์ œ์ถœํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ก A.4.2์—์„œ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2.5. ๋ฆฌ๋””๋ ‰์…˜

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋ฅผ ๋‹ค๋ฅธ URI๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜์—ฌ QUERY ์š”์ฒญ์— ๊ฐ„์ ‘์ ์œผ๋กœ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‹ค์Œ ์ฐธ์กฐ: 15.4์ ˆ, [HTTP]).

์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 301 (์˜๊ตฌ ์ด๋™, [HTTP], 15.4.2์ ˆ) ๋˜๋Š” 308 (์˜๊ตฌ ๋ฆฌ๋””๋ ‰์…˜, [HTTP], 15.4.9์ ˆ)์ธ ์‘๋‹ต์€ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๊ฐ€ Location ์‘๋‹ต ํ•„๋“œ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ URI๋กœ ์˜๊ตฌ์ ์œผ๋กœ ์ด๋™ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค ([HTTP], 10.2.2์ ˆ). ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 302 (๋ฐœ๊ฒฌ๋จ, [HTTP], 15.4.3์ ˆ) ๋˜๋Š” 307 (์ž„์‹œ ๋ฆฌ๋””๋ ‰์…˜, [HTTP], 15.4.8์ ˆ)์ธ ์‘๋‹ต์€ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ด๋™ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋„ค ๊ฒฝ์šฐ ๋ชจ๋‘ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ Location์—์„œ ์ฐธ์กฐํ•˜๋Š” ์ƒˆ ๋Œ€์ƒ URI๋กœ ์œ ์‚ฌํ•œ QUERY ์š”์ฒญ์„ ๋ณด๋‚ด ์›๋ž˜ QUERY ์š”์ฒญ์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Œ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

301 ๋˜๋Š” 302 ์‘๋‹ต ํ›„ POST๋ฅผ GET ์š”์ฒญ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ์˜ˆ์™ธ๋Š” QUERY ์š”์ฒญ์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

QUERY์— ๋Œ€ํ•ด ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 303 (๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์ฐธ์กฐ, 15.4.4์ ˆ, [HTTP])์ธ ์‘๋‹ต์€ Location ์‘๋‹ต ํ•„๋“œ์—์„œ ์ฐธ์กฐํ•˜๋Š” URI์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒ€์ƒ‰ ์š”์ฒญ์„ ํ†ตํ•ด ์›๋ž˜ ์ฟผ๋ฆฌ๋ฅผ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค ([HTTP], 10.2.2์ ˆ). HTTP์—์„œ๋Š” ์ƒˆ ๋Œ€์ƒ URI์— GET ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค์Œ ์˜ˆ์ œ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค: ๋ถ€๋ก A.4.3.

2.6. ์กฐ๊ฑด๋ถ€ ์š”์ฒญ

์„ ํƒ๋œ ํ‘œํ˜„(3.2์ ˆ, [HTTP])์€ QUERY ์š”์ฒญ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น QUERY ์š”์ฒญ์˜ ๋™๋“ฑ ๋ฆฌ์†Œ์Šค(2.2์ ˆ)์— ๋Œ€ํ•œ GET ์š”์ฒญ์˜ ์„ ํƒ๋œ ํ‘œํ˜„๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ถ€ QUERY๋Š” ์„ ํƒ๋œ ํ‘œํ˜„(์ฆ‰, ์ฝ˜ํ…์ธ  ํ˜‘์ƒ์ด ์ด๋ฃจ์–ด์ง„ ํ›„์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ)์ด ์กฐ๊ฑด๋ถ€ ํ—ค๋” ํ•„๋“œ์— ๊ธฐ์ˆ ๋œ ์ƒํ™ฉ์—์„œ๋งŒ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋„๋ก ์š”์ฒญํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค์Œ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: 13์ ˆ, [HTTP].

๋ถ€๋ก A.5์—์„œ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2.7. ์บ์‹ฑ

QUERY ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์‘๋‹ต์€ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›„์† QUERY ์š”์ฒญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค: 4์ ˆ, [HTTP-CACHING].

QUERY ์š”์ฒญ์˜ ์บ์‹œ ํ‚ค(2์ ˆ, [HTTP-CACHING])๋Š” ๋ฐ˜๋“œ์‹œ ์š”์ฒญ ์ฝ˜ํ…์ธ (6์ ˆ, [HTTP-CACHING]) ๋ฐ ๊ด€๋ จ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(8์ ˆ, [HTTP])๋ฅผ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์บ์‹œ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์บ์‹œ๋Š” ์˜๋ฏธ์ƒ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์ฐจ์ด๋ฅผ ์š”์ฒญ ์ฝ˜ํ…์ธ ์™€ ๊ด€๋ จ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ๋จผ์ € ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ฝ˜ํ…์ธ  ์ธ์ฝ”๋”ฉ ์ œ๊ฑฐ (8.4์ ˆ, [HTTP]).
  • ์š”์ฒญ์˜ Content-Type ํ•„๋“œ์— ์žˆ๋Š” ๋ฏธ๋””์–ด ํ•˜์œ„ ์œ ํ˜• ์ ‘๋ฏธ์‚ฌ๋กœ ํ‘œ์‹œ๋˜๋Š” ํ˜•์‹ ๊ทœ์น™์— ๊ด€ํ•œ ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๊ทœํ™” (์˜ˆ: "+json"; ๋‹ค์Œ ์ฐธ์กฐ: 4.2.8์ ˆ, [RFC6838]).
  • ์š”์ฒญ์˜ Content-Type ํ•„๋“œ๋กœ ํ‘œ์‹œ๋˜๋Š” ์ฝ˜ํ…์ธ  ์ž์ฒด์˜ ์˜๋ฏธ๋ก ์— ๊ด€ํ•œ ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๊ทœํ™”.

์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์€ ์˜ค์ง ์บ์‹œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ๋งŒ ์ˆ˜ํ–‰๋˜๋ฉฐ, ์š”์ฒญ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

ํด๋ผ์ด์–ธํŠธ๋Š” "no-transform" ์บ์‹œ ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ( 5.2.1.6์ ˆ, [HTTP-CACHING]) ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค๋Š” ๋œป์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹จ, ์ด ์ง€์‹œ์–ด๋Š” ๊ถŒ๊ณ ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค).

QUERY ๋ฉ”์„œ๋“œ ์‘๋‹ต์˜ ์บ์‹ฑ์€ GET ์‘๋‹ต์˜ ์บ์‹ฑ๋ณด๋‹ค ๋ณธ์งˆ์ ์œผ๋กœ ๋ณต์žกํ•˜๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์บ์‹œ ํ‚ค๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๋ฉด ์š”์ฒญ ์ฝ˜ํ…์ธ ๋ฅผ ์™„์ „ํžˆ ์ฝ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. QUERY ์‘๋‹ต์ด Location ์‘๋‹ต ํ•„๋“œ(2.4์ ˆ)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋™๋“ฑ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด (2.2์ ˆ), ํด๋ผ์ด์–ธํŠธ๋Š” ํ›„์† ์š”์ฒญ์—์„œ GET์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.8. ๋ฒ”์œ„ ์š”์ฒญ

QUERY์— ๋Œ€ํ•œ ๋ฒ”์œ„ ์š”์ฒญ์˜ ์˜๋ฏธ๋ก ์€ GET์— ๋Œ€ํ•œ ์˜๋ฏธ๋ก ๊ณผ ๊ฐ™์œผ๋ฉฐ, ๋‹ค์Œ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: 14์ ˆ, [HTTP]. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ”์ดํŠธ ๋ฒ”์œ„ ์š”์ฒญ์€ (์ž‘์„ฑ ์‹œ์ ์— ์ •์˜๋œ ์œ ์ผํ•œ ๋ฒ”์œ„ ๋‹จ์œ„) QUERY ์š”์ฒญ์˜ ๊ฒฐ๊ณผ์—๋Š” ๋ณ„๋‹ค๋ฅธ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ํ˜•์‹์€ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€๋ณ„๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ณ ์œ ํ•œ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, SQL์˜ "FETCH FIRST ... ROWS ONLY"๊ฐ€ ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด HTTP ๋ฒ”์œ„ ์š”์ฒญ ๋Œ€์‹  ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.


3. Accept-Query ํ—ค๋” ํ•„๋“œ

"Accept-Query" ์‘๋‹ต ํ—ค๋” ํ•„๋“œ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ QUERY ๋ฉ”์„œ๋“œ ์ง€์›์„ ์ง์ ‘ ์•Œ๋ฆฌ๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์ฟผ๋ฆฌ ํ˜•์‹์˜ ๋ฏธ๋””์–ด ์œ ํ˜•์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Accept-Query์—๋Š” ๋ฏธ๋””์–ด ๋ฒ”์œ„ ๋ชฉ๋ก(12.5.1์ ˆ, [HTTP])์ด "๊ตฌ์กฐํ™” ํ•„๋“œ" ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค [STRUCTURED-FIELDS]. ๋ฏธ๋””์–ด ๋ฒ”์œ„๋Š” Token ๋˜๋Š” String์œผ๋กœ ๊ตฌ์„ฑ๋œ List ๊ตฌ์กฐํ™” ํ—ค๋” ํ•„๋“œ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๋ฏธ๋””์–ด ๋ฒ”์œ„ ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋””์–ด ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด String ๋˜๋Š” Token ์œ ํ˜•์˜ ๊ตฌ์กฐํ™” ํ•„๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. Token๊ณผ String ์ค‘ ์–ด๋А ๊ฒƒ์„ ์„ ํƒํ•˜๋Š”์ง€๋Š” ์˜๋ฏธ์ƒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ˆ˜์‹ ์ž๋Š” Token์„ String์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค, ์ฆ‰ ์ˆ˜์‹ ํ•œ ์œ ํ˜•์— ๋”ฐ๋ผ ์ด๋“ค์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ฏธ๋””์–ด ์œ ํ˜•์€ Token์— ์ •ํ™•ํžˆ ๋Œ€์‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฏธ๋””์–ด ์œ ํ˜•์€ ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” String ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ์™€์ผ๋“œ์นด๋“œ ์‚ฌ์šฉ์€ ๋ชจ๋“  ์œ ํ˜•์— ์ผ์น˜ํ•˜๋Š” "*/*" ๋˜๋Š” ํ‘œ์‹œ๋œ ์œ ํ˜•์˜ ๋ชจ๋“  ํ•˜์œ„ ์œ ํ˜•์— ์ผ์น˜ํ•˜๋Š” "xxxx/*"๋ฟ์ž…๋‹ˆ๋‹ค.

ํ•„๋“œ ๊ฐ’์— ๋‚˜์—ด๋œ ์œ ํ˜•์˜ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Accept-Query ํ•„๋“œ์˜ ๊ฐ’์€ ์„œ๋ฒ„์—์„œ ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋“  URI์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ฟผ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์„œ๋กœ ๋‹ค๋ฅธ Accept-Query ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ˆ˜์‹ ํ•œ ์‹ ์„ ํ•œ ๊ฐ’(๋‹ค์Œ์— ๋”ฐ๋ฆ„: 4.2์ ˆ, [HTTP-CACHING])์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

Accept-Query: "application/jsonpath", application/sql;charset="UTF-8"

์ด ํ•„๋“œ์˜ ๊ตฌ๋ฌธ์€ "Accept" ๊ฐ™์€ ๋‹ค๋ฅธ ํ•„๋“œ์™€ ์œ ์‚ฌํ•ด ๋ณด์ด์ง€๋งŒ (12.5.1์ ˆ, [HTTP]), ๊ตฌ์กฐํ™” ํ•„๋“œ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: 4์ ˆ, [STRUCTURED-FIELDS].


4. ๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ

QUERY ๋ฉ”์„œ๋“œ์—๋Š” ๋ชจ๋“  HTTP ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์ผ๋ฐ˜ ๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋ฉฐ, ์ด๋Š” [HTTP]์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ ์ •๋ณด๋ฅผ URI(์˜ˆ: ์ฟผ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ)์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URI๋Š” ์š”์ฒญ ์ฝ˜ํ…์ธ ๋ณด๋‹ค ์ค‘๊ฐœ์ž์— ์˜ํ•ด ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ, ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ์ด ๋ฐฉ์‹์ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” URI๊ฐ€ ๋กœ๊ทธ์— ๊ธฐ๋ก๋  ๊ฐ€๋Šฅ์„ฑ์ด GET๋ณด๋‹ค QUERY๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์ด์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ QUERY ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ž„์‹œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ (์˜ˆ: Location ๋˜๋Š” Content-Location ํ•„๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด), ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— URI๋ฅผ ํ• ๋‹นํ•˜๋ฉฐ, ์š”์ฒญ์— ๋กœ๊ทธ์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น URI๋Š” ๊ฐ€๊ธ‰์  ์›๋ž˜ ์š”์ฒญ ์ฝ˜ํ…์ธ ์˜ ๋ฏผ๊ฐํ•œ ๋ถ€๋ถ„์„ ํฌํ•จํ•˜์ง€ ์•Š๋„๋ก ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

QUERY ์ฝ˜ํ…์ธ ๋ฅผ ์ž˜๋ชป ์ •๊ทœํ™”ํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ •๊ทœํ™”ํ•˜๋Š” ์บ์‹œ๋Š” ์ •๊ทœํ™”๋กœ ์ธํ•ด ๊ฑฐ์ง“ ์–‘์„ฑ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ž˜๋ชป๋œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (CORS)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ QUERY ์š”์ฒญ์—๋Š” "์‚ฌ์ „ ์š”์ฒญ"์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. QUERY๋Š” CORS ์•ˆ์ „ ๋ชฉ๋ก์— ํฌํ•จ๋œ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์— ์†ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ([FETCH] ์ฐธ์กฐ).


5. IANA ๊ณ ๋ ค ์‚ฌํ•ญ

5.1. QUERY ๋ฉ”์„œ๋“œ ๋“ฑ๋ก

IANA๋Š” QUERY ๋ฉ”์„œ๋“œ๋ฅผ "ํ•˜์ดํผํ…์ŠคํŠธ ์ „์†ก ํ”„๋กœํ† ์ฝœ(HTTP) ๋ฉ”์„œ๋“œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ"์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์น˜๋Š” <http://www.iana.org/assignments/http-methods>์ž…๋‹ˆ๋‹ค (๋‹ค์Œ ์ฐธ์กฐ: 16.3.1์ ˆ, [HTTP]).

ํ‘œ 2: QUERY ๋ฉ”์„œ๋“œ ์ •์˜
๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์•ˆ์ „ํ•จ ๋ฉฑ๋“ฑ์ ์ž„ ๋ช…์„ธ
QUERY ์˜ˆ ์˜ˆ 2์ ˆ, RFC 10008

5.2. Accept-Query ํ•„๋“œ ๋“ฑ๋ก

IANA๋Š” Accept-Query ํ•„๋“œ๋ฅผ "ํ•˜์ดํผํ…์ŠคํŠธ ์ „์†ก ํ”„๋กœํ† ์ฝœ(HTTP) ํ•„๋“œ ์ด๋ฆ„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ"์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์น˜๋Š” <https://www.iana.org/assignments/http-fields>์ž…๋‹ˆ๋‹ค (๋‹ค์Œ ์ฐธ์กฐ: 16.1.1์ ˆ, [HTTP]).

ํ‘œ 3: Accept-Query ํ•„๋“œ ์ •์˜
ํ•„๋“œ ์ด๋ฆ„ ์ƒํƒœ ๊ตฌ์กฐํ™” ์œ ํ˜• ์ฐธ์กฐ ์„ค๋ช…
Accept-Query ์˜๊ตฌ List 3์ ˆ, RFC 10008

6. ์ฐธ๊ณ  ๋ฌธํ—Œ

6.1. ๊ทœ๋ฒ”์  ์ฐธ๊ณ  ๋ฌธํ—Œ

[HTTP-CACHING]
Fielding, R., ํŽธ์ง‘, Nottingham, M., ํŽธ์ง‘ ๋ฐ J. Reschke, ํŽธ์ง‘, โ€œHTTP ์บ์‹ฑโ€, STD 98, RFC 9111, DOI 10.17487/RFC9111, 6์›” 2022๋…„, <https://www.rfc-editor.org/info/rfc9111>.
[HTTP]
Fielding, R., ํŽธ์ง‘, Nottingham, M., ํŽธ์ง‘ ๋ฐ J. Reschke, ํŽธ์ง‘, โ€œHTTP ์˜๋ฏธ๋ก โ€, STD 97, RFC 9110, DOI 10.17487/RFC9110, 6์›” 2022๋…„, <https://www.rfc-editor.org/info/rfc9110>.
[RFC2119]
Bradner, S., โ€œํ•ต์‹ฌ ๋‹จ์–ด: ์š”๊ตฌ ์‚ฌํ•ญ ์ˆ˜์ค€์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด RFC์—์„œ ์‚ฌ์šฉโ€, BCP 14, RFC 2119, DOI 10.17487/RFC2119, 3์›” 1997๋…„, <https://www.rfc-editor.org/info/rfc2119>.
[RFC8174]
Leiba, B., โ€œ๋ชจํ˜ธ์„ฑ: RFC 2119 ํ•ต์‹ฌ ๋‹จ์–ด์˜ ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž ๊ฐ„โ€, BCP 14, RFC 8174, DOI 10.17487/RFC8174, 5์›” 2017๋…„, <https://www.rfc-editor.org/info/rfc8174>.
[STRUCTURED-FIELDS]
Nottingham, M. ๋ฐ P-H. Kamp, โ€œ๊ตฌ์กฐํ™” ํ•„๋“œ ๊ฐ’: HTTP์šฉโ€, RFC 9651, DOI 10.17487/RFC9651, 2024๋…„ 9์›”, <https://www.rfc-editor.org/info/rfc9651>.
[URI]
Berners-Lee, T., Fielding, R. ๋ฐ L. Masinter, โ€œํ†ตํ•ฉ ๋ฆฌ์†Œ์Šค ์‹๋ณ„์ž (URI): ์ผ๋ฐ˜ ๊ตฌ๋ฌธโ€, STD 66, RFC 3986, DOI 10.17487/RFC3986, 1์›” 2005๋…„, <https://www.rfc-editor.org/info/rfc3986>.

6.2. ์ •๋ณด์„ฑ ์ฐธ๊ณ  ๋ฌธํ—Œ

[FETCH]
WHATWG, โ€œFETCHโ€, WHATWG ํ˜„ํ–‰ ํ‘œ์ค€, <https://fetch.spec.whatwg.org>.
์ปค๋ฐ‹ ์Šค๋ƒ…์ƒท: <https://fetch.spec.whatwg.org/commit-snapshots/3bab31a55154bda73f25b45a23df718616f2f64e/>.
[RFC3253]
Clemm, G., Amsden, J., Ellison, T., Kaler, C. ๋ฐ J. Whitehead, โ€œ๋ฒ„์ „ ๊ด€๋ฆฌ ํ™•์žฅ: WebDAV (์›น ๋ถ„์‚ฐ ์ €์ž‘ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ)โ€, RFC 3253, DOI 10.17487/RFC3253, 3์›” 2002๋…„, <https://www.rfc-editor.org/info/rfc3253>.
[RFC4918]
Dusseault, L., ํŽธ์ง‘, โ€œHTTP ํ™•์žฅ: ์›น ๋ถ„์‚ฐ ์ €์ž‘ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ (WebDAV)โ€, RFC 4918, DOI 10.17487/RFC4918, 2007๋…„ 6์›”, <https://www.rfc-editor.org/info/rfc4918>.
[RFC5323]
Reschke, J., ํŽธ์ง‘, Reddy, S., Davis, J. ๋ฐ A. Babich, โ€œ์›น ๋ถ„์‚ฐ ์ €์ž‘ ๋ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ (WebDAV) SEARCHโ€, RFC 5323, DOI 10.17487/RFC5323, 2008๋…„ 11์›”, <https://www.rfc-editor.org/info/rfc5323>.
[RFC6838]
Freed, N., Klensin, J. ๋ฐ T. Hansen, โ€œ๋ฏธ๋””์–ด ์œ ํ˜• ๋ช…์„ธ ๋ฐ ๋“ฑ๋ก ์ ˆ์ฐจโ€, BCP 13, RFC 6838, DOI 10.17487/RFC6838, 1์›” 2013๋…„, <https://www.rfc-editor.org/info/rfc6838>.
[RFC8259]
Bray, T., ํŽธ์ง‘, โ€œ JavaScript ๊ฐ์ฒด ํ‘œ๊ธฐ๋ฒ• (JSON) ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ˜•์‹โ€, STD 90, RFC 8259, DOI 10.17487/RFC8259, 2017๋…„ 12์›”, <https://www.rfc-editor.org/info/rfc8259>.
[RFC9535]
Gรถssner, S., ํŽธ์ง‘, Normington, G., ํŽธ์ง‘ ๋ฐ C. Bormann, ํŽธ์ง‘, โ€œJSONPath: ์ฟผ๋ฆฌ ํ‘œํ˜„์‹, JSON์šฉโ€, RFC 9535, DOI 10.17487/RFC9535, 2024๋…„ 2์›”, <https://www.rfc-editor.org/info/rfc9535>.
[URL]
WHATWG, โ€œURLโ€, WHATWG ํ˜„ํ–‰ ํ‘œ์ค€, <https://url.spec.whatwg.org>.
์ปค๋ฐ‹ ์Šค๋ƒ…์ƒท: <https://url.spec.whatwg.org/commit-snapshots/52526653e848c5a56598c84aa4bc8ac9025fb66b/>.
[XSLT]
Kay, M., ํŽธ์ง‘, โ€œXSL ๋ณ€ํ™˜ (XSLT) ๋ฒ„์ „ 3.0โ€, W3C ๊ถŒ๊ณ ์•ˆ, 2017๋…„ 6์›”, <https://www.w3.org/TR/2017/REC-xslt-30-20170608/>.
์ตœ์‹  ๋ฒ„์ „์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://www.w3.org/TR/xslt-30/.

๋ถ€๋ก A. ์˜ˆ์ œ

์•„๋ž˜ ์˜ˆ์ œ๋Š” ์„ค๋ช…๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ์งง์€ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค๋ฉด GET์„ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚˜์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฏธ๋””์–ด ์œ ํ˜•์€ "application/x-www-form-urlencoded"์ž…๋‹ˆ๋‹ค(๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ์˜ POST ์š”์ฒญ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค์Œ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: "application/x-www-form-urlencoded", [URL]). ๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด Content-Length ํ•„๋“œ๋Š” ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค.

A.1. ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ

์•„๋ž˜๋Š” ์ง์ ‘ ์‘๋‹ต์ด ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค:

QUERY /contacts HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Accept: application/json

select=surname,givenname,email&limit=10&match=%22email=*@example.*%22

์‘๋‹ต:

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

[
  { "surname": "Smith",
    "givenname": "John",
    "email": "smith@example.org" },
  { "surname": "Jones",
    "givenname": "Sally",
    "email": "sally.jones@example.com" },
  { "surname": "Dubois",
    "givenname": "Camille",
    "email": "camille.dubois@example.net" }
]

A.2. QUERY ์ง€์› ํ™•์ธ

QUERY ์ง€์›์„ ํ™•์ธํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ OPTIONS (9.3.7์ ˆ, [HTTP]) ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

OPTIONS /contacts HTTP/1.1
Host: example.org

์‘๋‹ต:

HTTP/1.1 200 OK
Allow: GET, QUERY, OPTIONS, HEAD

Allow ์‘๋‹ต ํ•„๋“œ(10.2.1์ ˆ, [HTTP])๋Š” ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค์—์„œ ์ง€์›๋˜๋Š” ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

OPTIONS ์‚ฌ์šฉ์—๋Š” ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„์˜ ์ง€์› ์—ฌ๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ์•Œ์ง€ ๋ชปํ•ด๋„ QUERY ์š”์ฒญ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ 405 (ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ, 15.5.6์ ˆ, [HTTP]) ๊ฐ™์€ 4xx ์ƒํƒœ๋กœ Allow ์‘๋‹ต ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

A.3. QUERY ํ˜•์‹ ํ™•์ธ

QUERY์—์„œ ์ง€์›๋˜๋Š” ๋ฏธ๋””์–ด ์œ ํ˜•์€ Accept-Query ์‘๋‹ต ํ•„๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (3์ ˆ):

HEAD /contacts HTTP/1.1
Host: example.org

์‘๋‹ต:

HTTP/1.1 200 OK
Content-Type: application/xhtml
Accept-Query: application/x-www-form-urlencoded, application/sql

์–ด๋–ค ์š”์ฒญ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์‘๋‹ต์— Accept-Query๊ฐ€ ํฌํ•จ๋˜๋Š”์ง€๋Š” ์ ‘๊ทผํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Accept-Query๋ฅผ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  QUERY ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ -- 415 ์‘๋‹ต(์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฏธ๋””์–ด ์œ ํ˜•, 15.5.16์ ˆ, [HTTP]) ๊ฐ™์€ 4xx ์ƒํƒœ์ธ ๊ฒฝ์šฐ -- Accept ์‘๋‹ต ํ•„๋“œ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (12.5.1์ ˆ, [HTTP]):

HTTP/1.1 415 Unsupported Media Type
Content-Type: application/xhtml
Accept: application/x-www-form-urlencoded, application/sql

A.4. Content-Location, Location ๋ฐ ๊ฐ„์ ‘ ์‘๋‹ต

๋‹ค์Œ ์ ˆ์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ, 2.3์ ˆ ๋ฐ 2.4์ ˆ, ์„ฑ๊ณต ์‘๋‹ต์— ์žˆ๋Š” Content-Location ๋ฐ Location ์‘๋‹ต ํ•„๋“œ๋Š” (2xx, 15.3์ ˆ, [HTTP]) GET ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ๋Œ€์ฒด ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์š”์ฒญ์—์„œ ์ˆ˜์‹ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ–ฅํ›„ ์š”์ฒญ์„ ์œ„ํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ์ œ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค: ๋ถ€๋ก A.1:

QUERY /contacts HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Accept: application/json

select=surname,givenname,email&limit=10&match=%22email=*@example.*%22

์‘๋‹ต:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Location: /contacts/stored-results/17
Location: /contacts/stored-queries/42
Last-Modified: Sat, 25 Aug 2012 23:34:45 GMT
Date: Sun, 17 Nov 2024, 16:10:24 GMT

[
  { "surname": "Smith",
    "givenname": "John",
    "email": "smith@example.org" },
  { "surname": "Jones",
    "givenname": "Sally",
    "email": "sally.jones@example.com" },
  { "surname": "Dubois",
    "givenname": "Camille",
    "email": "camille.dubois@example.net" }
]

A.4.1. Content-Location ์‚ฌ์šฉ

์œ„์—์„œ ์ˆ˜์‹ ํ•œ Content-Location ์‘๋‹ต ํ•„๋“œ๋Š” ์ž์‹ ์ด ํฌํ•จ๋œ QUERY ์‘๋‹ต์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์œ ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค:

GET /contacts/stored-results/17 HTTP/1.1
Host: example.org
Accept: application/json

์‘๋‹ต:

HTTP/1.1 200 OK
Last-Modified: Sat, 25 Aug 2012 23:34:45 GMT
Date: Sun, 17 Nov 2024, 16:10:25 GMT

[
  { "surname": "Smith",
    "givenname": "John",
    "email": "smith@example.org" },
  { "surname": "Jones",
    "givenname": "Sally",
    "email": "sally.jones@example.com" },
  { "surname": "Dubois",
    "givenname": "Camille",
    "email": "camille.dubois@example.net" }
]

์„œ๋ฒ„๊ฐ€ ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฌด๊ธฐํ•œ ๊ตฌํ˜„ํ•˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜ ์‘๋‹ต ํ›„ ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒˆ๋กœ์šด ๋Œ€์ฒด ์œ„์น˜๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์›๋ž˜ QUERY ์š”์ฒญ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

A.4.2. Location ์‚ฌ์šฉ

Location ์‘๋‹ต ํ•„๋“œ๋Š” ์›๋ž˜ QUERY ์š”์ฒญ๊ณผ ๊ฐ™์€ ์ฒ˜๋ฆฌ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ˜„์žฌ ๊ฒฐ๊ณผ๋กœ GET์— ์‘๋‹ตํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

GET /contacts/stored-queries/42 HTTP/1.1
Host: example.org
Accept: application/json

์ด ์˜ˆ์ œ์—์„œ๋Š” 2024-11-17T16:12:01Z์— ํ•ญ๋ชฉ ํ•˜๋‚˜๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ( Last-Modified ํ•„๋“œ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ), ์‘๋‹ต์—๋Š” ํ•ญ๋ชฉ ๋‘ ๊ฐœ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

HTTP/1.1 200 OK
Content-Type: application/json
Last-Modified: Sun, 17 November 2024, 16:12:01 GMT
ETag: "42-1"
Date: Sun, 17 Nov 2024, 16:13:17 GMT

[
  { "surname": "Smith",
    "givenname": "John",
    "email": "smith@example.org" },
  { "surname": "Dubois",
    "givenname": "Camille",
    "email": "camille.dubois@example.net" }
]

์„œ๋ฒ„๊ฐ€ ์—ฌ์ „ํžˆ ๋ฆฌ์†Œ์Šค๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์žˆ๊ณ  ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ๋ณ€๊ฒฝ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ํ›„์† ์กฐ๊ฑด๋ถ€ GET ์š”์ฒญ์€:

If-None-Match: "42-1"

304 (์ˆ˜์ •๋˜์ง€ ์•Š์Œ) ์‘๋‹ต์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค ( 15.4.5์ ˆ, [HTTP]).

A.4.3. ๊ฐ„์ ‘ ์‘๋‹ต

์„œ๋ฒ„๋Š” "๊ฐ„์ ‘" ์‘๋‹ต์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (2.5์ ˆ). ์ด๋•Œ ์ƒํƒœ ์ฝ”๋“œ 303 (๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์ฐธ์กฐ, 15.4.4์ ˆ, [HTTP])์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด, ๋ถ€๋ก A.4, ์„œ๋ฒ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

HTTP/1.1 303 See Other
Content-Type: text/plain
Date: Sun, 17 Nov 2024, 16:13:17 GMT
Location: /contacts/stored-queries/42

"/contacts/stored-queries/42"์— ์ €์žฅ๋œ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด๋Š” ์ง์ ‘ ์‘๋‹ต์— Location์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋Š” ๋Œ€์ฒด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค์Œ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๋ถ€๋ก A.4.2.

A.5. ์กฐ๊ฑด๋ถ€ ์š”์ฒญ

QUERY๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ "application/sql" ๋ฐ "application/xslt+xml" [XSLT]์„ ์š”์ฒญ ๋ฏธ๋””์–ด ์œ ํ˜•์œผ๋กœ ์ง€์›ํ•˜๊ณ , "text/csv"๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ฟผ๋ฆฌ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์—๋Š” RFC ๋ฌธ์„œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ฟผ๋ฆฌ๋Š” 10๋…„ ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™”๋œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

QUERY /rfc-index.xml HTTP/1.1
Host: example.org
Date: Sun, 7 Sep 2025, 00:00:00 GMT
Content-Type: application/xslt+xml
Accept: text/csv

...XSLT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ์ฝ˜ํ…์ธ ...

์‘๋‹ต:

HTTP/1.1 200 OK
Date: Sun, 7 Sep 2025, 00:00:00 GMT
Location: /stored-queries/4815162342
Content-Type: text/csv
Accept-Query: "application/sql", "application/xslt+xml"
Last-Modified: Sun, 31 Aug 2025, 08:44:00 GMT
Vary: Accept-Query, Content-Encoding, Content-Type

decade, total, with errata, % with errata, average page count
1960, 26, 5, 19.2, 5.3
1970, 666, 18, 2.7, 6.1
1980, 376, 44, 11.7, 23.4
1990, 1593, 269, 16.9, 25.5
2000, 2888, 1048, 36.3, 27.3
2010, 2954, 895, 30.3, 26.1
2020, 1133, 230, 20.3, 26.2

์—ฌ๊ธฐ์„œ ์„œ๋ฒ„๋Š” "/stored-queries/4815162342" ๊ฒฝ๋กœ๋ฅผ ๋™๋“ฑ ๋ฆฌ์†Œ์Šค์— ํ• ๋‹นํ•˜์—ฌ (2.4์ ˆ) ์ดํ›„ GET์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€๋งŒ, ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค:

QUERY /rfc-index.xml HTTP/1.1
Host: example.org
Date: Mon, 8, Sep 2025, 11:00:00 GMT
Content-Type: application/sql
Accept: text/csv
If-Modified-Since: Sun, 31 Aug 2025, 08:44:00 GMT
Vary: Accept-Query, Content-Type

...๊ฐ™์€ ์ฟผ๋ฆฌ์ด์ง€๋งŒ SQL ์‚ฌ์šฉ...

์ฟผ๋ฆฌ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์„œ๋ฒ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค:

HTTP/1.1 304 Not Modified
Date: Mon, 8 Sep 2025, 11:00:00 GMT
Content-Type: text/csv
Location: /stored-queries/4815162342
Accept-Query: "application/sql", "application/xslt+xml"
Last-Modified: Sun, 31 Aug 2025, 08:44:00 GMT
Vary: Accept-Query, Content-Type

์„œ๋ฒ„๊ฐ€ ๋™๋“ฑ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์‹๋ณ„ํ–ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— GET์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ์š”์ฒญ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค์‹œ ์ „์†กํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

GET /stored-queries/4815162342 HTTP/1.1
Host: example.org
Date: Sun, 21, Sep 2025, 12:08:00 GMT
Accept: text/csv
If-Modified-Since: Sun, 31 Aug 2025, 00:00:00 GMT

์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์˜ ์ƒํƒœ๊ฐ€ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ƒˆ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค:

HTTP/1.1 200 OK
Date: Sun, 21, Sep 2025, 12:08:00 GMT
Content-Type: text/csv
Last-Modified: Thu, 18 Sep 2025, 19:56:00 GMT
Vary: Accept-Query, Content-Encoding, Content-Type

decade, total, with errata, % with errata, average page count
1960, 26, 5, 19.2, 5.3
1970, 666, 18, 2.7, 6.1
1980, 376, 44, 11.7, 23.4
1990, 1593, 269, 16.9, 25.5
2000, 2888, 1048, 36.3, 27.3
2010, 2954, 895, 30.3, 26.1
2020, 1133, 230, 20.3, 26.2

(์ด 10๋…„ ๊ธฐ๊ฐ„์— ํ•ด๋‹นํ•˜๋Š” ํ–‰์˜ ๋ณ€๊ฒฝ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.)

์•„๋ž˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์กฐ๊ฑด๋ถ€ ์š”์ฒญ์˜ ์‚ฌ์šฉ๊ณผ, ๋™๋“ฑ ๋ฆฌ์†Œ์Šค์— URI๊ฐ€ ํ• ๋‹น๋˜์—ˆ์„ ๋•Œ(๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฅผ ํ™œ์šฉํ•  ๋•Œ) ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ๊ฐ€์ƒ์˜ ํ•„๋“œ ์ด๋ฆ„ "Validator"๋Š” ์„ค๋ช…์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ฆฌ์†Œ์Šค ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•œ QUERY 200 OK Validator: foo ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•œ QUERY ('foo'๋ฅผ ์กฐ๊ฑด์œผ๋กœ ํ•จ) 304 Not Modified Validator: foo ์ƒํƒœ ๋ณ€๊ฒฝ ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•œ QUERY ('foo'๋ฅผ ์กฐ๊ฑด์œผ๋กœ ํ•จ) 200 OK Validator: bar

๊ทธ๋ฆผ 1: QUERY๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„

ํด๋ผ์ด์–ธํŠธ ๋ฆฌ์†Œ์Šค ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•œ QUERY ๋™๋“ฑ ๋ฆฌ์†Œ์Šค (/xyz ์ƒ์„ฑ) 200 OK Validator: foo Location: /xyz GET ('foo'๋ฅผ ์กฐ๊ฑด์œผ๋กœ ํ•จ) 304 Not Modified Validator: foo ์ƒํƒœ ๋ณ€๊ฒฝ GET ('foo'๋ฅผ ์กฐ๊ฑด์œผ๋กœ ํ•จ) 200 OK Validator: bar

๊ทธ๋ฆผ 2: ๋™๋“ฑ ๋ฆฌ์†Œ์Šค์— GET์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„

A.6. ์ถ”๊ฐ€ ์ฟผ๋ฆฌ ํ˜•์‹

๋‹ค์Œ ์˜ˆ์ œ๋Š” JSON ํ˜•ํƒœ์˜ [RFC8259] RFC ์ •์˜คํ‘œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

์•„๋ž˜ ์š”์ฒญ์€ ํ™•์žฅ ๊ฐ€๋Šฅ ์Šคํƒ€์ผ์‹œํŠธ ์–ธ์–ด ๋ณ€ํ™˜(XSLT)์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๋„ ๋ฐ ์ •์˜๋œ ์ •์˜คํ‘œ ์œ ํ˜•๋ณ„๋กœ ์š”์•ฝ๋œ ์ •์˜คํ‘œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

QUERY /errata.json HTTP/1.1
Host: example.org
Content-Type: application/xslt+xml
Accept: application/xml, text/csv

<transform xmlns="http://www.w3.org/1999/XSL/Transform"
  xmlns:j="http://www.w3.org/2005/xpath-functions"
  version="3.0">

  <output method="text"/>

  <param name="input"/>

  <variable name="json"
    select="json-to-xml(unparsed-text($input))"/>

  <variable name="sc">errata_status_code</variable>
  <variable name="sd">submit_date</variable>

  <template match="/">
    <text>year, total, rejected, verified, hdu, reported</text>
    <text>&#10;</text>
    <variable name="en" select="$json//j:map"/>
    <for-each-group select="$en"
      group-by="substring-before(j:string[@key=$sd],'-')">
      <sort select="current-grouping-key()"/>
      <variable name="year" select="current-grouping-key()"/>
      <variable name="errata" select=
        "$en[$year=substring-before(j:string[@key=$sd],'-')]"/>
      <value-of select="concat(
        $year,
        ', ',
        count($errata),
        ', ',
        count($errata['Rejected'=j:string[@key=$sc]]),
        ', ',
        count($errata['Verified'=j:string[@key=$sc]]),
        ', ',
        count(
          $errata['Held for Document Update'=j:string[@key=$sc]]),
        ', ',
        count($errata['Reported'=j:string[@key=$sc]]),
        '&#10;')"/>
    </for-each-group>
  </template>

</transform>

์‘๋‹ต:

HTTP/1.1 200 OK
Content-Type: text/csv
Accept-Query: "application/jsonpath", "application/xslt+xml"
Date: Wed, 19 Feb 2025, 17:10:01 GMT

year, total, rejected, verified, hdu, reported
2000, 14, 0, 14, 0, 0
2001, 72, 1, 70, 1, 0
2002, 124, 8, 104, 12, 0
2003, 63, 0, 61, 2, 0
2004, 89, 1, 83, 5, 0
2005, 156, 10, 96, 50, 0
2006, 444, 54, 176, 214, 0
2007, 429, 48, 188, 193, 0
2008, 423, 52, 165, 206, 0
2009, 331, 39, 148, 144, 0
2010, 538, 80, 232, 222, 4
2011, 367, 47, 170, 150, 0
2012, 348, 54, 149, 145, 0
2013, 341, 61, 169, 106, 5
2014, 342, 73, 180, 72, 17
2015, 343, 79, 145, 89, 30
2016, 295, 46, 122, 82, 45
2017, 303, 46, 120, 84, 53
2018, 350, 61, 118, 98, 73
2019, 335, 47, 131, 94, 63
2020, 387, 68, 117, 123, 79
2021, 321, 44, 148, 63, 66
2022, 358, 37, 198, 40, 83
2023, 262, 38, 121, 33, 70
2024, 322, 33, 125, 23, 141
9999, 1, 0, 0, 1, 0

๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ํ˜•์‹์ธ JSONPath๋„ ์ง€์›๋จ์„ ๋‚˜ํƒ€๋‚ด๋Š” Accept-Query ์‘๋‹ต ํ•„๋“œ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค [RFC9535]. ์•„๋ž˜ ์š”์ฒญ์€ 2024๋…„ ์ดํ›„ ์ œ์ถœ๋œ ์ •์˜คํ‘œ ์ค‘ ๊ฑฐ๋ถ€๋œ ๋ชจ๋“  ์ •์˜คํ‘œ์˜ ์‹๋ณ„์ž๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค:

QUERY /errata.json HTTP/1.1
Host: example.org
Content-Type: application/jsonpath
Accept: application/json

$..[
     ?@.errata_status_code=="Rejected"
     && @.submit_date>"2024"
   ]
   ["doc-id"]

์‘๋‹ต:

HTTP/1.1 200 OK
Content-Type: application/json
Accept-Query: "application/jsonpath", "application/xslt+xml"
Date: Thu, 20 Feb 2025, 09:55:42 GMT
Last-Modified: Thu, 20 Feb 2025 06:10:01 GMT

[
  "RFC1185","RFC8407","RFC6350","RFC8467","RFC1157","RFC9543",
  "RFC9076","RFC7656","RFC2822","RFC9460","RFC2104","RFC6797",
  "RFC9499","RFC9557","RFC2131","RFC2328","RFC9001","RFC3325",
  "RFC9438","RFC2526","RFC2985","RFC7643","RFC9132","RFC6376",
  "RFC9110","RFC9460","RFC7748","RFC9497","RFC8463","RFC4035",
  "RFC7239","RFC9083","RFC9537","RFC9537","RFC9420","RFC9000",
  "RFC9656","RFC9110","RFC2324","RFC2549","RFC6797","RFC2549",
  "RFC8894"
]

๋ถ€๋ก B. ๋ฉ”์„œ๋“œ ์ด๋ฆ„ 'QUERY'์˜ ์„ ์ •

"ํ•˜์ดํผํ…์ŠคํŠธ ์ „์†ก ํ”„๋กœํ† ์ฝœ(HTTP) ๋ฉ”์„œ๋“œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ" (<http://www.iana.org/assignments/http-methods>)์—๋Š” "์•ˆ์ „ํ•จ" ๋ฐ "๋ฉฑ๋“ฑ์ ์ž„" ์†์„ฑ์„ ๊ฐ–๋Š” ๋‹ค๋ฅธ ์„ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: "PROPFIND" [RFC4918], "REPORT" [RFC3253] ๋ฐ "SEARCH" [RFC5323].

์ด๋“ค ์ค‘ ์–ด๋А ๊ฒƒ์ด๋“  ์žฌ์‚ฌ์šฉํ•˜์—ฌ, ์ด ๋ช…์„ธ์—์„œ ์ƒˆ ๋ฉ”์„œ๋“œ "QUERY"๋กœ ์ •์˜ํ•˜๋Š” ๋‚ด์šฉ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด ๋ช…์„ธ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” "SEARCH"๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ "QUERY"๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋‹ค๋ฅธ ํ›„๋ณด๋“ค์€ ์š”์ฒญ ์ฝ˜ํ…์ธ ์— ์ผ๋ฐ˜์ ์ธ ๋ฏธ๋””์–ด ์œ ํ˜•("application/xml")์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์š”์ฒญ์˜ ์˜๋ฏธ๋ก ์€ ์ „์ ์œผ๋กœ ์š”์ฒญ ์ฝ˜ํ…์ธ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์ด๋“ค์€ ๋ชจ๋‘ WebDAV ํ™œ๋™์—์„œ ์œ ๋ž˜ํ–ˆ์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•ด ๋งŽ์€ ์‚ฌ๋žŒ์ด ๋ณตํ•ฉ์ ์ธ ๊ฐ์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • "QUERY"๋Š” URI์˜ ์ฟผ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ์™€์˜ ๊ด€๊ณ„๋ฅผ ์ž˜ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ์˜ ๊ธ€

์•„์ด๋””์–ด, ๊ฒ€ํ†  ๋ฐ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•œ HTTP ์ž‘์—… ๊ทธ๋ฃน์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์›๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ถ„๋“ค๊ป˜ ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค: Carsten Bormann, Mark Nottingham, Martin Thomson, Michael Thornburgh, Roberto Polli, Roy Fielding ๋ฐ Will Hawkins.


๊ธฐ์—ฌ์ž

Ashok Malhotra๋Š” ์ด ๋ช…์„ธ๋กœ ์ด์–ด์ง„ ์ดˆ๊ธฐ ๋…ผ์˜์— ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค:

Ashok Malhotra
์ด๋ฉ”์ผ: malhotrasahib@gmail.com

์ด HTTP ๋ฉ”์„œ๋“œ์— ๊ด€ํ•œ ๋…ผ์˜๋Š” Asbjรธrn Ulsberg๊ฐ€ HTTP ์›Œํฌ์ˆ์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. 2019๋…„์˜ ์ผ์ž…๋‹ˆ๋‹ค:

Asbjรธrn Ulsberg
์ด๋ฉ”์ผ: asbjorn@ulsberg.no
URI: https://asbjor.nu/

์ €์ž ์ฃผ์†Œ

Julian Reschke
greenbytes GmbH
Hafenweg 16
Mรผnster, 48155
๋…์ผ
์ด๋ฉ”์ผ: julian.reschke@greenbytes.de
URI: https://greenbytes.de/tech/webdav/
James M Snell
Cloudflare
์ด๋ฉ”์ผ: jasnell@gmail.com
Mike Bishop
Akamai
์ด๋ฉ”์ผ: mbishop@evequefou.be