이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 13672|회답: 1

[HTML/HTML5] GET와 POST의 차이는 양식 제출 동작입니다

[링크 복사]
게시됨 2014. 12. 6. 오전 10:54:55 | | |
HTTP는 서버와 상호작용하는 다양한 방식을 정의하며, 기본적으로 GET, POST, PUT, DELETE의 4가지 방법이 있습니다. URL의 전체 명칭은 리소스 디스크립터로, 네트워크 내 리소스를 설명하는 데 사용됩니다. HTTP에서 GET, POST, PUT, DELETE 는 이 리소스를 검사, 수정, 추가, 삭제하는 네 가지 연산에 해당합니다. 이 시점에서 일반적인 이해를 얻으실 겁니다. GET는 일반적으로 자원 정보를 얻거나 조회하는 데 사용되고, POST는 일반적으로 자원 정보를 업데이트하는 데 사용됩니다.

1. HTTP 명세에 따르면, GET는 정보 검색에 사용되며 안전하고 멪등성이어야 합니다.

(1). 이른바 보안이란 조작이 정보를 수정하는 것이 아니라 정보를 얻기 위해 사용된다는 것을 의미합니다. 즉, GET 요청은 일반적으로 부작용이 없어야 합니다. 즉, 데이터베이스 쿼리와 마찬가지로 자원 정보만 얻으며, 자원의 상태를 수정하거나 추가하거나 영향을 주지 않습니다.

* 참고: 여기서 '보안'의 의미는 수정되지 않은 정보만을 의미합니다.

(2). 멪등성은 동일한 URL에 대한 여러 요청이 동일한 결과를 반환해야 함을 의미합니다.

하지만 실제로는 위의 두 규정이 그렇게 엄격하지 않습니다. 다른 사람의 기사를 인용하는 예시: 예를 들어, 뉴스 사이트의 첫 페이지는 지속적으로 업데이트됩니다. 두 번째 요청은 다른 뉴스 배치를 반환하지만, 항상 최신 뉴스를 반환하기 때문에 여전히 안전하고 멩등성으로 간주됩니다. 근본적으로, 사용자가 링크를 열 때 자신의 관점에서 자원이 변경되지 않았다는 확신을 가질 수 있는 것이 목표라면,

2. HTTP 명세에 따르면, POST는 서버의 자원을 수정할 수 있는 요청을 나타냅니다. 위 예시를 계속 인용하자면: 여전히 뉴스 웹사이트를 예로 들면, 독자들은 댓글이 제출되거나 수정된 후 사이트의 자원이 달라지기 때문에 뉴스에 자신의 댓글을 남겨야 합니다.



위 내용은 HTTP 명세에서 GET와 POST의 원칙 몇 가지를 대략적으로 설명합니다. 하지만 실제로 HTTP 명세를 수행할 때 많은 사람들이 HTTP 명세를 따르지 않아 이 문제가 발생할 수 있는 여러 원인이 발생할 수 있습니다:

1. 많은 사람들이 POST 사용에 FORM에 가야 해서 자원을 업데이트할 때 GET를 사용하는데, 이는 약간 번거로울 수 있습니다.

2. 자원의 추가, 삭제, 수정, 검사 작업은 GET/POST를 통해 실제로 완료할 수 있으며, PUT와 DELETE를 사용할 필요가 없습니다.

3. 또 다른 이유는 초기 웹 MVC 프레임워크 설계자들이 URL을 추상 자원으로 의도적으로 다루고 설계하지 않았기 때문에, 전통적인 웹 MVC 프레임워크는 기본적으로 두 가지 HTTP 메서드인 GET와 POST만 지원하고 PUT과 DELETE 메서드는 지원하지 않는다는 점입니다.

* MVC에 대한 간단한 설명: MVC는 원래 데스크톱 프로그램에 존재했으며, M은 데이터 모델을, V는 사용자 인터페이스를 의미하며, C는 컨트롤러를 의미합니다. MVC를 사용하는 목적은 M과 V의 구현 코드를 분리하여 동일한 프로그램이 서로 다른 표현을 사용할 수 있도록 하는 것입니다.

위의 세 가지 항목은 일반적으로 HTTP 명세를 엄격히 준수하지 않는 구형 스타일을 설명하며, 아키텍처 개발과 함께 HTTP 명세를 지원하는 새로운 스타일인 REST(Representational State Transfer)가 등장합니다.



기본 문제를 이야기한 후, 표면 현상에서 GET와 POST의 차이를 살펴보겠습니다:

1. GET 요청의 데이터는 URL에 첨부됩니다(즉, 데이터는 HTTP 프로토콜 헤더에 위치합니다). URL을 분할하고 데이터를 전송하면, 매개변수들은 다음과 같이 연결됩니다. 예를 들어: login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD. 데이터가 영어 문자/숫자라면 그대로 보내고, 공백이라면 +로 변환하며, 중국어 또는 기타 문자라면 BASE64로 문자열을 직접 암호화하여 다음과 같은 샘플을 얻습니다: %E4%BD%A0%E5%A5%BD, 여기서 XX는 16진수 기호로 표현되는 ASCII입니다.

POST는 제출된 데이터를 HTTP 패킷의 패킷 본체에 배치합니다.

2. "GET 메서드로 제출할 최대 데이터는 1024바이트에 불과하며, 이론적으로 POST에는 제한이 없고, IIS4에서는 최대 80KB, IIS5에서는 100KB까지 대량의 데이터를 전송할 수 있습니다??!

위 문장은 다른 기사에서 리디렉션된 것으로, 사실 이렇게 말하는 것은 잘못되고 부정확합니다:

(1). 우선, "GET 메서드로 제출되는 데이터는 최대 1024바이트"입니다. GET는 URL을 통해 데이터를 제출하기 때문에, GET가 제출할 수 있는 데이터의 양은 URL 길이와 직접적으로 관련이 있습니다. 사실 URL에는 상한선 매개변수 제한이 없으며, HTTP 프로토콜 명세도 URL의 길이를 제한하지 않습니다. 이 제한은 특정 브라우저와 서버에 의해 부과되는 제한입니다. IE의 URL 길이 제한은 2083바이트(2K+35)입니다. Netscape, FireFx 같은 다른 브라우저에는 이론적인 길이 제한이 없으며, 그 한계는 운영체제 지원 여부에 따라 달라집니다.

이 방법은 매개변수 값 데이터 길이뿐만 아니라 전체 URL 길이를 제한한다는 점에 유의하세요. [참고문헌 5 참조]

(2). 이론적으로 POST에는 크기 제한이 없고, HTTP 프로토콜 명세에도 크기 제한이 없으며, "POST 데이터에 80K/100K 크기의 제한이 있다"고 말하는 것은 부정확하며, POST 데이터에 한계가 없으며, 서버 핸들러의 처리 능력이 제한 역할을 합니다.

ASP 프로그램의 경우, 각 폼 필드를 처리할 때 요청 객체의 데이터 길이 제한이 100K입니다. 하지만 Request.BinaryRead에서는 그런 제한이 없습니다.

이와 관련해 IIS 6.0에서는 보안상의 이유로 제한 조치를 강화했습니다. 또한 다음과 같은 점에 주의를 기울여야 합니다:

1). IIS 6.0은 기본적으로 최대 200 KB의 ASP POST 데이터를 허용하며, 각 폼 필드당 제한은 100 KB입니다.
2). IIS 6.0 업로드 파일의 기본 크기는 4MB입니다.
3). IIS 6.0은 기본적으로 최대 요청 헤더를 16KB로 설정합니다.
이러한 제한 사항은 IIS 6.0 이전에는 제공되지 않았습니다. [참고문헌 5 참조]

그래서 위의 80K와 100K는 기본 값일 수 있지만(참고: IIS4와 IIS5의 파라미터는 아직 확인하지 않았습니다), 직접 설정할 수도 있습니다. 각 버전의 IIS에서 기본 값이 다르므로, 자세한 내용은 관련 IIS 구성 문서를 참조하시기 바랍니다.

3. ASP에서는 서버가 GET 요청 매개변수를 얻기 위해 Request.QueryString을, POST 요청 매개변수를 얻기 위해 Request.Form을 사용합니다. JSP에서는 request.getParameter(\"XXXX\")를 사용해 얻으세요. jsp에도 request.getQueryString() 메서드가 있지만 사용이 더 까다롭습니다. 예를 들어: test.jsp?name=hyddd&password=hyddd를 보내고, request.getQueryString()을 사용해 :name= 를 얻습니다. hyddd&password=hyddd. PHP에서는 $_GET와 $_POST를 사용해 각각 GET와 POST에서 데이터를 얻을 수 있고, $_REQUEST은 GET와 POST 요청 모두에서 데이터를 얻을 수 있습니다. JSP에서 요청을, PHP에서 $_REQUEST를 사용하는 데에는 숨겨진 위험이 있다는 점도 주목할 만하며, 이는 다음 기사에서 요약할 예정입니다.

4.POST GET보다 더 안전합니다. 참고: 여기서 언급된 보안은 위 GET에서 언급한 '보안'과 동일한 개념이 아닙니다. 예를 들어, GET를 통해 데이터를 제출하면, 사용자명과 비밀번호가 URL에 평문으로 표시됩니다. (1) 로그인 페이지가 브라우저에 캐시되어 있을 수 있고, (2) 다른 사람들이 브라우저 기록을 확인해 다른 사람들이 당신의 계정과 비밀번호를 얻을 수 있기 때문입니다 위조 공격.

요약하자면, Get은 서버에 데이터를 요청하는 요청이고, Post는 서버에 데이터를 제출하는 요청입니다. FORM에서는 메서드가 기본값으로 "GET"입니다. 본질적으로 GET과 POST는 서로 다른 전송 메커니즘일 뿐, 하나가 받아서 보내는 방식이 아닙니다!





이전의:QQ 이모티콘 eif 이미지를 빠르게 추출하세요
다음:컴퓨터 협회는 H3C H3C 기술자를 고용하여 협회 회원들에게 네트워크에 대해 교육했습니다
게시됨 2014. 12. 7. 오후 5:24:18 |
읽고 다시 글을 올리는 것은 미덕입니다
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com