GET 대신 HTTP POST 또는 DELETE를 사용하여 삭제해야 하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/786070

  •  16-09-2019
  •  | 
  •  

문제

나는 Microsoft의 ASP.NET MVC 튜토리얼을 진행하여 이 페이지에 이르렀습니다.

http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

이 페이지 하단에는 다음과 같은 내용이 나와 있습니다.

일반적으로 웹 애플리케이션의 상태를 수정하는 작업을 호출할 때 HTTP GET 작업을 수행하고 싶지 않습니다.삭제를 수행할 때 HTTP POST 또는 더 나은 방법으로는 HTTP DELETE 작업을 수행하려고 합니다.

이것이 사실입니까?이 진술의 근거에 대해 더 자세한 설명을 제공할 수 있는 사람이 있습니까?

편집하다

위키피디아 다음과 같이 말합니다.

일부 메소드(예: HEAD, GET, OPTIONS 및 TRACE)는 안전한 것으로 정의됩니다. 즉, 정보 검색용으로만 사용되며 서버 상태를 변경해서는 안 됩니다.

대조적으로, POST, PUT 및 DELETE와 같은 메소드는 서버에서 부작용을 일으킬 수 있는 작업을 위한 것입니다.

도움이 되었습니까?

해결책

Jon Skeet의 대답은 정식 답변입니다. 그러나 : 링크가 있다고 가정합니다.

href = "\myApp\DeleteImportantData.aspx?UserID=27"

그리고 Google-bot이오고 페이지를 색인화합니까? 그러면 어떻게됩니까?

다른 팁

GET은 일반적으로 부작용이 없습니다. 다시 말해서, 상태는 변경되지 않습니다. 즉, 결과를 캐시 할 수 있으며 북마크를 안전하게 만들 수 있습니다.

에서 HTTP 1.1 RFC 2616

구현자는 소프트웨어가 인터넷을 통한 상호 작용의 사용자를 대표한다는 것을 알고 있어야하며, 사용자가 자신이나 타인에게 예기치 않은 행동을 할 수있는 모든 조치를 알 수 있도록 조심해야합니다.

특히, GET 및 헤드 방법이 검색 이외의 행동을 취하는 데 중요하지 않아야한다는 협약이 확립되었습니다. 이 방법들은 "안전한"것으로 간주되어야합니다. 이를 통해 사용자 에이전트는 POST, PIT 및 DELETE와 같은 다른 방법을 특별한 방식으로 표현할 수 있으므로 사용자는 안전하지 않은 조치가 요청되고 있다는 사실을 알 수 있습니다.

당연히 GET 요청을 수행 한 결과 서버가 부작용을 생성하지 않도록 할 수 없습니다. 실제로 일부 동적 리소스는이 기능을 고려합니다. 여기서 중요한 차이점은 사용자가 부작용을 요청하지 않았으므로 책임을지는 것입니다.

Idempotent와 관련된 순수한 문제 외에도 실용적인 측면이 있습니다. 거미/봇/크롤러 등은 하이퍼 링크를 따릅니다. "삭제"작업이 Get을 수행하는 하이퍼 링크로서 Google을 모두 삭제할 수 있습니다. 보다 "운명의 거미".

게시물이 있으면 위험이 아닙니다.

또 다른 예..

http://example.com/admin/articles/delete/2

로그인 한 경우 올바른 권한이있는 경우 기사가 삭제됩니다. 귀하의 사이트가 예를 들어 주석을 수락하고 사용자가 이미지로 링크를 제출하는 경우; 그렇게 :

<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>

그런 다음 관리자가 사이트의 의견을 탐색 할 때 브라우저는 해당 URL에 요청을 보내서 해당 이미지를 가져 오려고 시도합니다. 그러나 브라우저가 수행하는 동안 로그인하기 때문에 기사가 삭제됩니다.

대부분의 브라우저는 이미지를 찾을 수 없다면 아무것도 표시하지 않으므로 소스 코드를 보지 않고도 눈치 채지 못할 수도 있습니다.

그것이 말이되기를 바랍니다.

여기에서 내 대답을 참조하십시오. 이 질문에 동일하게 적용됩니다.

  • 프리 페치 : 많은 웹 브라우저가 프리 페치를 사용합니다. 즉, 링크를 클릭하기 전에 페이지가로드됩니다. 나중에 해당 링크를 클릭 할 것으로 예상됩니다.
  • 봇 : 정보를 위해 인터넷을 스캔하고 색인하는 봇이 여러 개 있습니다. 그들은 요청 만 발행합니다. 이런 이유로 GET 요청에서 무언가를 삭제하고 싶지 않습니다.
  • 캐싱 : HTTP 요청을받는 것은 상태를 변경해서는 안되며 Idempotent가되어야합니다. idempotent는 요청을 한 번 발행하거나 여러 번 발급하면 동일한 결과를 얻는다는 것을 의미합니다. 즉 부작용이 없습니다. 이러한 이유로 HTTP 요청은 캐싱에 밀접하게 연결되어 있습니다.
  • HTTP 표준은 그렇게 말합니다: HTTP 표준은 각 HTTP 방법이 무엇인지 말합니다. 여러 프로그램은 HTTP 표준을 사용하도록 만들어졌으며, 귀하가 예상대로 사용할 것이라고 가정합니다. 따라서 따르지 않으면 수많은 임의의 프로그램에서 정의되지 않은 행동을 취할 것입니다.

거미와 요청 외에도 Idempotent가 있어야합니다. GET 요청에는 보안 문제도 있습니다. 누군가가 사용자에게 이메일을 쉽게 보낼 수 있습니다

<img src="http://yoursite/Delete/Me" />

텍스트에서 브라우저는 행복하게 따라 자원에 액세스 할 것입니다. Post를 사용하는 것은 그러한 것들을 치료하는 것이 아닙니다 (JavaScript로 양식 게시물을 잘 모을 수 있습니다). 그러나 좋은 시작입니다.

이 주제 (HTTP 메서드 사용법)에 대해이 블로그 게시물을 읽는 것이 좋습니다. http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/

이것은 실제로 반대 문제입니다. 데이터가 변경되지 않은 경우 게시물을 사용하지 않는 이유는 무엇입니까?

인터넷 뱅킹 애플리케이션이 있고 이체 페이지를 방문한다고 가정해 보겠습니다.로그인한 사용자가 $10를 다른 계좌로 이체하기로 선택했습니다.

제출 버튼을 클릭하면 (GET 요청으로) 다음으로 리디렉션됩니다. https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j

하지만 인터넷 연결이 느리거나 서버가 바쁘기 때문에 제출 버튼을 누른 후 새 페이지가 느리게 로드됩니다.

사용자는 좌절감을 느끼고 격렬하게 F5(페이지 새로 고침)를 누르기 시작합니다.무슨 일이 일어날지 맞춰보세요?두 번 이상의 이체가 발생하여 사용자 계정이 비워질 수 있습니다.


이제 요청이 POST(또는 GET 이외의 다른 방법)로 이루어지면 첫 번째 F5(페이지 새로 고침)를 통해 사용자는 브라우저에서 "정말로 그렇게 하시겠습니까?"라고 부드럽게 묻게 됩니다.부작용이 있을 수 있어요 [ bla bla bla ] ..."

여기에 언급 된 모든 우수한 이유와는 별도로, GET 요청은 수신자 서버에서 로그인 할 수 있습니다. access.log. 요청에서 암호와 같은 민감한 데이터를 전송하면 일반 텍스트로 로그인됩니다.

안전한 DB 스토리지를 위해 해시/소금에 절인 경우에도 위반 (또는 IT Guy의 어깨를 바라 보는 사람)이 공개 할 수 있습니다. 그러한 데이터는 포스트 본문에 들어가야합니다.

Get의 또 다른 문제는 명령이 브라우저 주소 표시 줄로 이동한다는 것입니다. 따라서 페이지를 새로 고치면 "마지막 물건 삭제", "주문 제출"또는 이와 유사한 명령을 다시 발행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top