쿼리 문자열
Query string쿼리 문자열은 지정된 파라미터에 값을 할당하는 Uniform Resource Locator(URL)의 일부입니다.쿼리 문자열에는 일반적으로 웹 브라우저 또는 기타 클라이언트 응용 프로그램에 의해 기본 URL에 추가된 필드(예를 들어 HTML의 일부), 페이지 모양 선택 또는 멀티미디어 [1][2][3]콘텐츠의 위치로 점프하는 필드가 포함됩니다.
웹 서버는 URL 경로에 따라 파일 시스템에서 파일을 읽거나 리소스 유형에 고유한 논리를 사용하여 요청을 처리함으로써 Hypertext Transfer Protocol(HTTP) 요청을 처리할 수 있습니다.특별한 로직이 호출되는 경우 해당 로직에서 URL의 경로 구성요소와 함께 쿼리 문자열을 사용할 수 있습니다.
구조.
쿼리 문자열을 포함하는 일반적인 URL은 다음과 같습니다.
https://example.com/over/there?name=ferret
서버는 이러한 페이지에 대한 요청을 수신하면 쿼리 문자열을 전달하면서 프로그램을 실행할 수 있습니다.이 경우 다음과 같습니다.name=ferret
, 프로그램에 변경되지 않습니다.물음표는 구분 기호로 사용되며 쿼리 [4][5]문자열의 일부가 아닙니다.
웹 프레임워크는 쿼리 문자열의 여러 매개 변수를 구문 분석하는 방법을 일부 [6]구분 기호로 구분하여 제공할 수 있습니다.다음 URL 예에서는 여러 쿼리 파라미터가 앰퍼샌드로 구분되어 있습니다.&
":
https://example.com/path/to/page?name=ferret&color=purple
쿼리 문자열의 정확한 구조는 표준화되지 않았습니다.쿼리 문자열을 구문 분석하는 데 사용되는 메서드는 웹 사이트에 따라 다를 수 있습니다.
웹 페이지 링크에 쿼리 문자열을 포함하는 URL이 있을 수 있습니다.HTML은 사용자 에이전트가 쿼리 문자열을 생성할 수 있는 세 가지 방법을 정의합니다.
- 를 경유하여 HTML 폼
<form.auto.>...</form.auto.>
요소 - 경유 서버측 이미지 맵
ismap
의 속성<img>
를 가진 요소<img ismap>
건설. - 지금은 폐지된 색인화된 검색
<isindex>
요소
웹 양식
원래 용도 중 하나는 웹 양식이라고도 하는 HTML 양식의 내용을 포함하는 것이었습니다.특히 필드를 포함하는 양식이field1
,field2
,field3
이 송신되면 필드의 내용은 다음과 같이 쿼리 문자열로 부호화됩니다.
field1=value1&field2=value2&field3=value3...
- 쿼리 문자열은 일련의 필드-값 쌍으로 구성됩니다.
- 각 쌍 내에서 필드 이름과 값은 등호 "로 구분됩니다.
=
". - 일련의 쌍은 앰퍼샌드로 구분됩니다.
&
(또는 세미콜론,;
에 의해 생성되지 않고 HTML에 포함된 URL의 경우<form>...</form>
아래를 참조해 주세요.
명확한 표준은 없지만 대부분의 웹 프레임워크에서는 하나의 필드에 여러 값을 연결할 수 있습니다(예:field1=value1&field1=value2&field2=value3
를 참조해 주세요.[7][8]
양식의 각 필드에 대해 쿼리 문자열에 쌍이 포함되어 있습니다.field=value
. 웹 양식에는 사용자에게 표시되지 않는 필드가 포함될 수 있습니다. 이러한 필드는 양식을 제출할 때 쿼리 문자열에 포함됩니다.
이 표기법은 W3C [6]권장사항입니다.W3C에서는 앰퍼샌드 구분자[9] 외에 모든 웹 서버가 세미콜론 구분자를 지원하여 엔티티 앰퍼샌드를 이스케이프하지 않고 HTML 문서 내의 URL에서 애플리케이션/x-www-form-urlencoded 쿼리 스트링을 허용하는 것이 좋습니다.
양식 제출 방식이 GET인 경우에만 양식 내용이 URL의 쿼리 문자열로 인코딩됩니다.송신 방식이 POST 의 경우, 디폴트에서는 같은 인코딩이 사용되지만, 결과는 변경 [1]후의 URL 에 포함되지 않고 HTTP 요구 본문으로 송신됩니다.
색인화된 검색
HTML에 폼이 추가되기 전에 브라우저는<isindex>
요소를 1행 텍스트 입력 컨트롤로 지정합니다.이 컨트롤에 입력된 텍스트는 기본 URL 또는 에 의해 지정된 다른 URL에 대한 GET 요구와 더불어 쿼리 문자열로 서버에 전송되었습니다.action
속성을 [10]지정합니다.이는 웹 서버가 제공된 텍스트를 쿼리 기준으로 사용하여 일치하는 [11]페이지 목록을 반환할 수 있도록 하기 위한 것입니다.
인덱스된 검색 컨트롤에 대한 텍스트 입력이 전송되면 다음과 같이 쿼리 문자열로 인코딩됩니다.
argument1+argument2+argument3...
- 쿼리 문자열은 텍스트를 공백에서 단어로 구문 분석하여 일련의 인수로 구성됩니다.
- 시리즈는 플러스 기호 '로 구분됩니다.
+
'.
단,<isindex>
요소는 더 이상 사용되지 않으며 대부분의 브라우저는 더 이상 해당 요소를 지원하거나 렌더링하지 않습니다. 색인화된 검색의 흔적이 남아 있습니다.예를 들어, 이것은 플러스 기호 '의 특수 처리의 소스입니다.+
브라우저 URL 비율 인코딩(지금은 색인화된 검색이 폐지되어 거의 용장화되어 있습니다)%20
또한 CGI를 지원하는 일부 웹 서버(예를 들어 Apache)는 쿼리 문자열에 등호가 없는 경우 명령줄 인수로 처리합니다.=
(CGI 1.1의 섹션 4.4에 따라).일부 CGI 스크립트는 HTML에 내장된 URL에 대해 여전히 이 이력 동작을 사용하고 있습니다.
URL 인코딩
일부 문자(예: 공백)는 URL의 일부가 될 수 없으며 일부 다른 문자는 URL에서 특별한 의미를 가집니다(예: 문자).#
를 사용하여 문서의 하위 섹션(또는 조각)을 추가로 지정할 수 있습니다.HTML 형식에서 문자는=
는 이름과 값을 구분하기 위해 사용됩니다.URI 범용 구문에서는 이 문제에 대처하기 위해 URL 인코딩을 사용하는 반면 HTML 형식에서는 이러한 모든 문자에 퍼센트 인코딩을 적용하는 대신 몇 가지 추가 대체가 이루어집니다.SPACE는 '로 인코딩됩니다.+
또는%20
"[12]
HTML 5는 "GET" 메서드를 사용하여 HTML 양식을 웹 [1]서버에 제출하기 위해 다음과 같은 변환을 지정합니다.다음으로 알고리즘의 개요를 나타냅니다.
- 올바른 문자 집합으로 변환할 수 없는 문자는 HTML 숫자 문자 참조로[13] 대체됩니다.
- SPACE는 '로 인코딩됩니다.
+
또는%20
' - 문자(
A
–Z
그리고.a
–z
, 숫자(0
–9
) 및 캐릭터 '~
','-
','.
' 및 '_
는 그대로 남습니다. +
%2B로 부호화되어 있습니다.- 기타 모든 문자는 로 인코딩됩니다.
%HH
ASC 이외의 16진수 표현처음에 UTF-8(또는 기타 지정된 인코딩)로 인코딩된II 문자)
칠드에 대응하는 옥텟("")~
RFC3986에 의해 쿼리 문자열로 허용되지만 HTML 형식으로 % 인코딩되어 있어야 합니다.%7E
".
SPACE의 부호화(')+
' 및 '있는 그대로' 문자를 선택하면 이 인코딩이 RFC 3986과 구별됩니다.
예
양식이 HTML 페이지에 다음과 같이 포함되어 있는 경우:
< >형태 액션.="/cgi-bin/test.cgi" 방법=「취득」> < >입력 유형="텍스트" 이름.="처음" /> < >입력 유형="텍스트" 이름.="초" /> < >입력 유형="실패" /> </형태>
사용자는 두 텍스트 필드에 "이것은 필드"와 "clear (clear (clear (clear (clear)?")?" 문자열을 삽입하고 "Submit (submit)"버튼을 누릅니다.test.cgi
(에 의해 지정된 프로그램)action
의 속성form
위의 예의 요소)는 다음 쿼리 문자열을 수신합니다.first=this+is+a+field&second=was+it+clear+%28already%29%3F
.
CGI 스크립트에 의해 폼이 서버에서 처리되는 경우 스크립트는 일반적으로 다음과 같은 환경변수로 쿼리 문자열을 수신합니다.QUERY_STRING
.
추적
쿼리 문자열을 수신하는 프로그램은 일부 또는 전부를 무시할 수 있습니다.요청된 URL이 프로그램이 아닌 파일에 해당하는 경우 쿼리 문자열 전체가 무시됩니다.단, 쿼리 문자열의 사용 여부에 관계없이 이를 포함한 전체 URL이 서버 로그 파일에 저장됩니다.
이러한 사실을 통해 HTTP cookie에서 제공되는 것과 유사한 방법으로 쿼리 문자열을 사용하여 사용자를 추적할 수 있습니다.이렇게 하려면 사용자가 페이지를 다운로드할 때마다 고유 식별자를 선택하여 페이지에 포함된 모든 링크의 URL에 쿼리 문자열로 추가해야 합니다.사용자가 이러한 링크 중 하나를 따라가자마자 대응하는 URL이 서버에 요구됩니다.이렇게 하면 이 페이지의 다운로드가 이전 페이지와 링크됩니다.
예를 들어, 다음을 포함하는 웹 페이지가 요청된 경우:
<a href="foo.foot"> 마이페이지 참조!</a> <a href="bar.disc"> 내 것이 좋다 </a>
다음과 같은 독특한 문자열e0a72cb2a2c7
를 선택하면 다음과 같이 페이지가 변경됩니다.
<a href="foo.foo?cb2a2c7"> 페이지 참조!</a> <a href="bar.disc?e0a72cb2a2c7"> 내 것이 더 좋다 </a>
쿼리 문자열을 추가해도 페이지가 사용자에게 표시되는 방법은 변경되지 않습니다.사용자가 예를 들어 첫 번째 링크에 접속하면 브라우저는 페이지를 요구합니다.foo.html?e0a72cb2a2c7
서버로의 이행은 다음 내용을 무시합니다.?
페이지를 보냅니다.foo.html
쿼리 문자열을 링크에도 추가합니다.
이렇게 하면 이 사용자의 후속 페이지 요청은 동일한 쿼리 문자열을 전송합니다.e0a72cb2a2c7
따라서 이러한 모든 페이지가 동일한 사용자에 의해 표시되었음을 확인할 수 있습니다.쿼리 문자열은 종종 웹 비콘과 함께 사용됩니다.
추적에 사용되는 쿼리 문자열과 HTTP 쿠키의 주요 차이점은 다음과 같습니다.
- 쿼리 문자열은 URL의 일부를 형성하기 때문에 사용자가 URL을 저장 또는 다른 사용자에게 보낼 때 포함됩니다.쿠키는 브라우징 세션 전체에서 유지되지만 URL과 함께 저장 또는 전송되지는 않습니다.
- 사용자가 두 개 이상의 독립된 경로를 통해 동일한 웹 서버에 도착하면 저장된 쿠키가 동일한 상태에서 두 개의 서로 다른 쿼리 문자열이 할당됩니다.
- 사용자는 쿠키를 비활성화할 수 있습니다. 이 경우 쿠키를 추적에 사용할 수 없습니다.단, 추적에 쿼리 문자열을 사용하는 것은 모든 상황에서 작동해야 합니다.
- 페이지에 대한 다른 방문에 의해 전달되는 다른 쿼리 문자열은 브라우저(또는 존재하는 경우 프록시) 캐시에서 페이지가 처리되지 않음을 의미하므로 웹 서버의 부하가 증가하고 사용자 환경이 느려집니다.
호환성 문제
HTTP 사양에 따라 다음 작업을 수행합니다.
실제로 요청 회선 길이에 대한 다양한 애드혹 제한이 있습니다.모든 HTTP 송신자 및 수신자는 최소 8000 옥텟의 [14]요청 행 길이를 지원하는 것이 좋습니다.
URL이 너무 길면 웹 서버가 실패하고 414 Request-URI Too Long HTTP 상태 코드가 표시됩니다.
이러한 문제의 일반적인 회피책은 GET 대신 POST를 사용하여 요청 본문에 파라미터를 저장하는 것입니다.일반적으로 요청 본문의 길이 제한은 URL 길이 제한보다 훨씬 큽니다.예를 들어 POST 크기 제한은 기본적으로 IIS 4.0에서는 2MB, IIS 5.0에서는 128KB입니다.제한은 Apache2에서 다음을 사용하여 구성할 수 있습니다.LimitRequestBody
디렉티브: 요구 [15]본문에서 허용되는0 ~ 2147483647(2GB)의 바이트 수를 지정합니다.
「 」를 참조해 주세요.
- 클린 URL
- 식별자를 클릭합니다.
- Common Gateway Interface(CGI; 공통 게이트웨이 인터페이스)
- HTTP 쿠키
- HyperText Transfer Protocol(HyperText Transfer Protocol)
- 시멘틱 URL
- URI 방식
- UTM 파라미터
- 웹 비콘
레퍼런스
- ^ a b c [1], HTML5.2, W3C 권장, 2017년 12월 14일
- ^ 유튜브에 타임스탬프를 추가하는 4가지 방법
- ^ index.php 파라미터– MediaWiki
- ^ T. Berners-Lee; R. Fielding; L. Masinter (January 2005). "RFC 3986". "Syntax Components" (section 3).
- ^ T. Berners-Lee; R. Fielding; L. Masinter (January 2005). "RFC 3986". "Query" (section 3.4).
- ^ a b HTML 문서의 양식.W3.org 를 참조해 주세요.2013-09-08에 취득.
- ^ "ServletRequest (Java EE 6 )". docs.oracle.com. 2011-02-10. Retrieved 2013-09-08.
- ^ "uri – Authoritative position of duplicate HTTP GET query keys". Stack Overflow. 2013-06-09. Retrieved 2013-09-08.
- ^ 퍼포먼스, 구현 및 설계 노트.W3.org 를 참조해 주세요.2013-09-08에 취득.
- ^ "<isindex>". HTML (HyperText Markup Language).
- ^ "HTML/Elements/isindex". W3C Wiki.
- ^ "HTML URL Encoding Reference". W3Schools. Retrieved May 1, 2013.
- ^ application/x-www-form-urlencoded 부호화 알고리즘, HTML5.2, W3C 권고, 2017년 12월 14일
- ^ HTTP/1.1 메시지 구문 및 라우팅.ietf.org 를 참조해 주세요.2014-07-31에 취득.
- ^ core: Apache HTTP 서버.Httpd.apache.org 를 참조해 주세요.2013-09-08에 취득.