etc./StackOverFlow

HTTP POST 요청에서 매개변수는 어떻게 전송됩니까?

청렴결백한 만능 재주꾼 2022. 2. 7. 06:19
반응형

질문자 :Camilo Martin


HTTP GET 요청에서 매개변수는 쿼리 문자열 로 전송됩니다.

 http://example.com/page ?parameter=value&also=another

HTTP POST 요청에서 매개변수는 URI와 함께 전송되지 않습니다.

가치는 어디에 있습니까? 요청 헤더에? 요청 본문에? 어떻게 생겼나요?



값은 콘텐츠 유형이 지정하는 형식으로 요청 본문에 전송됩니다.

일반적으로 콘텐츠 유형은 application/x-www-form-urlencoded 이므로 요청 본문은 쿼리 문자열과 동일한 형식을 사용합니다.

 parameter=value&also=another

양식에서 파일 업로드를 사용할 때 multipart/form-data 인코딩을 사용합니다. 더 복잡하지만 일반적으로 어떻게 생겼는지 신경 쓸 필요가 없으므로 예제를 보여주지 않겠지만 존재한다는 것만 알아두는 것이 좋을 수 있습니다.


Guffa

콘텐츠는 HTTP 헤더 뒤에 배치됩니다. HTTP POST의 형식은 HTTP 헤더, 빈 줄, 요청 본문이 뒤따르는 것입니다. POST 변수는 본문에 키-값 쌍으로 저장됩니다.

다음과 같이 HTTP Post의 원시 콘텐츠에서 이를 확인할 수 있습니다.

 POST /path/script.cgi HTTP/1.0 From: frog@jmarshall.com User-Agent: HTTPTool/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 32 home=Cosby&favorite+flavor=flies

Fiddler 와 같은 도구를 사용하여 이를 확인할 수 있습니다. Fiddler는 유선을 통해 전송되는 원시 HTTP 요청 및 응답 페이로드를 보는 데 사용할 수 있습니다.


Joe Alfano

짧은 대답: POST 요청에서 값은 요청의 "본문"으로 전송됩니다. application/x-www-form-urlencoded 또는 multipart/form-data 의 미디어 유형과 함께 전송될 가능성이 큽니다. 웹 요청을 처리하도록 설계된 프로그래밍 언어 또는 프레임워크는 일반적으로 이러한 요청에 대해 "The Right Thing™"을 수행하고 쉽게 디코딩된 값(예: PHP의 $_REQUEST 또는 $_POST cgi.FieldStorage() , Python의 flask.request.form


이제 차이점을 이해하는 데 도움이 될 수 있는 약간의 문제를 해결해 보겠습니다. ;)

GET 요청과 POST 요청의 차이점은 크게 의미가 있습니다. 그들은 또한 다르게 "사용"되어 값이 전달되는 방식의 차이를 설명합니다.

GET( 관련 RFC 섹션 )

GET 요청을 실행할 때 서버에 하나 또는 엔터티 집합을 요청합니다. 클라이언트가 결과를 필터링할 수 있도록 하기 위해 URL의 소위 "쿼리 문자열"을 사용할 수 있습니다. 쿼리 문자열은 ? . 이것은 URI 구문의 일부입니다.

따라서 애플리케이션 코드( 요청을 받는 부분)의 관점에서 이러한 값에 액세스하려면 URI 쿼리 부분을 검사해야 합니다.

키와 값은 URI의 일부입니다. 브라우저는 URI 길이에 제한을 둘 수 있습니다. HTTP 표준에는 제한이 없다고 명시되어 있습니다. 그러나 이 글을 쓰는 시점에서 대부분의 브라우저 URI를 제한합니다(특정 값이 없습니다). GET 요청은 서버에 새로운 정보를 제출하는 데 사용해서는 안됩니다. 특히 더 큰 문서는 아닙니다. POST 또는 PUT 을 사용해야 하는 곳입니다.

POST( 관련 RFC 섹션 )

POST 요청을 실행할 때 클라이언트는 실제로 원격 호스트에 새 문서를 제출합니다. 따라서 쿼리 문자열은 (의미상) 의미가 없습니다. 이것이 애플리케이션 코드에서 액세스할 수 없는 이유입니다.

POST 는 조금 더 복잡하고 훨씬 더 유연합니다.

POST 요청을 수신할 때 항상 "페이로드" 또는 HTTP 용어로 메시지 본문을 예상해야 합니다. 메시지 본문 자체는 표준 (내가 말할 수 있는 한. 응용 프로그램/옥텟 스트림?) 형식이 없기 때문에 꽤 쓸모가 없습니다. 본문 형식은 Content-Type 헤더에 의해 정의됩니다. method="POST" 와 함께 FORM 요소를 사용할 때 이것은 일반적으로 application/x-www-form-urlencoded 입니다. 또 다른 매우 일반적인 유형은 파일 업로드를 사용 하는 경우 multipart/form-data입니다. text/plain , application/json 또는 사용자 지정 application/octet-stream 이르기까지 무엇이든 될 수 있습니다.

어쨌든 애플리케이션에서 처리할 수 없는 Content-Type POST 요청이 이루어지면 415 상태 코드를 반환해야 합니다.

대부분의 프로그래밍 언어(및/또는 웹 프레임워크)는 가장 일반적인 유형(예: application/x-www-form-urlencoded , multipart/form-data 또는 application/json )에서 메시지 본문을 해독/인코딩하는 방법을 제공합니다. . 그래서 쉽습니다. 사용자 정의 유형은 잠재적으로 약간 더 많은 작업이 필요합니다.

표준 HTML 형식으로 인코딩된 문서를 예로 사용하여 애플리케이션은 다음 단계를 수행해야 합니다.

  1. Content-Type 필드 읽기
  2. 값이 지원되는 미디어 유형 중 하나가 아니면 415 상태 코드와 함께 응답을 반환합니다.
  3. 그렇지 않으면 메시지 본문에서 값을 디코딩합니다.

다시 말하지만, PHP와 같은 언어 또는 다른 인기 있는 언어의 웹 프레임워크가 이를 처리할 것입니다. 이에 대한 예외는 415 오류입니다. 어떤 프레임워크도 애플리케이션이 지원하거나 지원하지 않는 콘텐츠 유형을 예측할 수 없습니다. 이것은 당신에게 달려 있습니다.

PUT( 관련 RFC 섹션 )

PUT POST 요청과 거의 동일한 방식으로 처리됩니다. 가장 큰 차이점은 POST 요청은 서버가 새 리소스를 생성하는 방법(그리고 생성된 경우)을 결정하도록 한다는 것입니다. 역사적으로(지금은 사용되지 않는 RFC2616부터 요청이 전송된 URI의 "하위"(하위)로 새 리소스를 생성하는 것이었습니다).

PUT 대비에서 요청이 정확히 URI에서 "예금"리소스로 가정하고 정확하게 내용입니다. 그 이상도 이하도 아닌. 아이디어는 클라이언트전체 리소스를 "PUTting"하기 전에 제작할 책임이 있다는 것입니다. 서버는 주어진 URL에서 있는 그대로 받아들여야 합니다.

결과적으로 POST 요청은 일반적으로 기존 리소스 를 교체하는 데 사용되지 않습니다. PUT 요청은 생성과 교체를 모두 수행할 수 있습니다.

보조 노트

원격에 추가 데이터를 보내는 데 사용할 수 있는 " 경로 매개변수 "도 있지만 너무 흔하지 않으므로 여기에서 너무 자세히 설명하지 않겠습니다. 그러나 참고로 다음은 RFC에서 발췌한 내용입니다.

계층적 경로의 점 세그먼트를 제외하고 경로 세그먼트는 일반 구문에 의해 불투명한 것으로 간주됩니다. URI 생성 응용 프로그램은 종종 세그먼트에서 허용되는 예약 문자를 사용하여 체계별 또는 역참조 처리기별 하위 구성요소를 구분합니다. 예를 들어, 세미콜론(";") 및 등호("=") 예약 문자는 해당 세그먼트에 적용할 수 있는 매개변수 및 매개변수 값을 구분하는 데 자주 사용됩니다. 쉼표(",") 예약 문자는 비슷한 용도로 자주 사용됩니다. 예를 들어, 한 URI 생산자는 "name;v=1.1"과 같은 세그먼트를 사용하여 "name"의 버전 1.1에 대한 참조를 나타낼 수 있는 반면, 다른 URI 생산자는 "name,1.1"과 같은 세그먼트를 사용하여 동일한 것을 나타낼 수 있습니다. 매개변수 유형은 체계별 의미론에 의해 정의될 수 있지만 대부분의 경우 매개변수 구문은 URI 역참조 알고리즘의 구현에 따라 다릅니다.


exhuma

브라우저 URL 표시줄에 직접 입력할 수 없습니다.

예를 들어 라이브 HTTP 헤더 를 사용하여 인터넷에서 POST 데이터가 전송되는 방식을 볼 수 있습니다. 결과는 다음과 같을 것입니다

 http://127.0.0.1/pass.php POST /pass.php HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate DNT: 1 Referer: http://127.0.0.1/pass.php Cookie: passx=87e8af376bc9d9bfec2c7c0193e6af70; PHPSESSID=l9hk7mfh0ppqecg8gialak6gt5 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 30 username=zurfyx&pass=password

그것이 말하는 곳

 Content-Length: 30 username=zurfyx&pass=password

포스트 값이 됩니다.


zurfyx

POST 요청의 기본 미디어 유형은 application/x-www-form-urlencoded 입니다. 이것은 키-값 쌍을 인코딩하는 형식입니다. 키는 중복될 수 있습니다. 각 키-값 쌍은 & 문자로 구분되고 각 키는 = 문자로 값과 구분됩니다.

예를 들어:

 Name: John Smith Grade: 19

다음과 같이 인코딩됩니다.

 Name=John+Smith&Grade=19

이것은 HTTP 헤더 뒤의 요청 본문에 배치됩니다.


Nejat

일부 웹 서비스에서는 요청 데이터메타데이터를 별도로 배치해야 합니다. 예를 들어 원격 기능은 서명된 메타데이터 문자열이 URI에 포함되어 있는 반면 데이터는 HTTP 본문에 게시될 것으로 예상할 수 있습니다.

POST 요청은 의미상 다음과 같이 보일 수 있습니다.

 POST /?AuthId=YOURKEY&Action=WebServiceAction&Signature=rcLXfkPldrYm04 HTTP/1.1 Content-Type: text/tab-separated-values; charset=iso-8859-1 Content-Length: [] Host: webservices.domain.com Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: identity User-Agent: Mozilla/3.0 (compatible; Indy Library) name id John G12N Sarah J87M Bob N33Y

이 접근 방식은 웹 서버에 대한 "파싱 명령"인 Content-Type 을 사용하여 QueryString과 Body-Post를 논리적으로 결합합니다.

참고: HTTP/1.1은 #32 (공백), 오른쪽에 #10 (줄 바꿈)으로 래핑 됩니다.


Interface Unknown

HTTP POST의 양식 값은 쿼리 문자열과 동일한 형식으로 요청 본문에 전송됩니다.

자세한 내용은 사양을 참조하십시오.


SLaks

GETPOST 구별하자.

Get: 서버에 대한 기본 HTTP 요청이며 서버에서 데이터를 검색하는 데 사용되며 ? URI 에서 고유 리소스를 검색하는 데 사용됩니다.

이것은 형식입니다

 GET /someweb.asp?data=value HTTP/1.0

여기서 data=value 는 전달된 쿼리 문자열 값입니다.

POST: 서버에 안전하게 데이터를 보내기 위해 사용하므로 필요한 것은 무엇이든 POST 요청 형식

 POST /somweb.aspHTTP/1.0 Host: localhost Content-Type: application/x-www-form-urlencoded //you can put any format here Content-Length: 11 //it depends Name= somename

GET보다 POST가 필요한 이유는 무엇입니까?

GET 에서 서버로 전송되는 값은 일반적으로 쿼리 문자열의 기본 URL에 추가됩니다. 이제 이에 대한 2가지 결과가 있습니다.

  • GET 요청은 매개변수와 함께 브라우저 기록에 저장됩니다. 따라서 비밀번호는 브라우저 기록에서 암호화되지 않은 상태로 유지됩니다. 이것은 당시 Facebook의 실제 문제였습니다.
  • 일반적으로 서버에는 URI 길이에 대한 제한이 있습니다. 전송되는 매개변수가 너무 많으면 414 Error - URI too long

포스트 요청의 경우 필드의 데이터가 대신 본문에 추가됩니다. 요청 매개변수의 길이가 계산되어 콘텐츠 길이에 대한 헤더에 추가되며 중요한 데이터는 URL에 직접 추가되지 않습니다.

Google 개발자 도구의 네트워크 섹션을 사용하여 서버에 요청하는 방법에 대한 기본 정보를 볼 수 있습니다.

Cache-Control , Origin , Accept 와 같은 Request Headers 에 항상 더 많은 값을 추가할 수 있습니다.


Zeeshan Adil

출처 : http:www.stackoverflow.com/questions/14551194/how-are-parameters-sent-in-an-http-post-request

반응형