언제 GET 또는 POST 방법을 사용해야합니까? 그들 사이의 차이점은 무엇입니까?


249

GET또는 POST방법을 사용할 때의 차이점은 무엇입니까 ? 어느 것이 더 안전한가요? 그들 각각의 장점은 무엇입니까?

( 유사한 질문 )


2
Get에는 본문이 없으므로 실제로는 복잡한 구조를위한 쿼리 문자열 인코딩 형식이 없기 때문에 데이터 구조로 이름-> 값 쌍으로 제한됩니다. 요청에서 더 복잡한 데이터 구조 (예 : 배열, 객체 등)를 처리 해야하는 경우 POST 및 더 고급 형식 (json / xml)을 사용해야합니다. 간단히 말해 : 실제로해야 할 경우가 아니면 GET을 사용하지 마십시오 (예 : URL / 리소스를 검색 할 수 있어야 함).
themihai

답변:


263

보안 문제가 아닙니다. HTTP 프로토콜을 정의는 인 것으로 요청 유형 GET 나무 등을 게시물 부작용이있을 수 있지만,. 일반 영어로, GET은 변경하지 않고 내용을 보는 데 사용되고 POST는 변경하기 위해 사용됩니다. 예를 들어, 검색 페이지는 GET을 사용해야하며 비밀번호를 변경하는 양식은 POST를 사용해야합니다.

또한 PHP는 개념을 약간 혼동합니다. POST 요청은 쿼리 문자열과 요청 본문을 통해 입력을받습니다. GET 요청은 쿼리 문자열에서 입력을 가져옵니다. 따라서 POST 요청은 GET 요청의 상위 집합입니다. 당신이 사용할 수있는 $_GETPOST 요청에, 그것도에서 같은 이름의 매개 변수를 가지고 감각을 만들 수 있습니다 $_POST$_GET그 의미 다른 일을.

예를 들어 기사를 편집하기위한 양식이 있다고 가정 해 봅시다. article-id는 쿼리 문자열에있을 수 있지만를 통해 사용할 수 $_GET['id']있지만 article-id를 변경한다고 가정 해 보겠습니다. 새로운 id는 요청 본문 ( $_POST['id'])에 존재할 수 있습니다 . 아마도 이것이 가장 좋은 예는 아니지만 둘 사이의 차이점을 보여주기를 바랍니다.


13
GET과 POST의 차이점에 대한 보안 측면이 있습니다. 예를 들어 악성 사이트는 임의의 GET 요청을 이미지 태그에 고정시켜 사용자가 다른 서버에 대해 GET을 수행 할 수 있습니다. 이 GET이 다른 서버 / deletemyaccount 와 같은 경우 나쁜 일이 발생합니다.
Frank Schwieterman 2009

2
내가 의미하는 것은 $ _POST의 내용이 악의적 인 사용자에게 마술처럼 숨겨지지 않았다는 것입니다. 모든 프로그래밍에는 보안 측면이 분명히 있습니다.
troelskn

1
이 게시물은 보안 관련 내용에 대해 언급하지 않았기 때문에 질문에 완전히 대답하지 않습니다. 철자 오류 "pain English"가 "plain English"로 변경되는 한 상단이 좋습니다. 바닥 부분이 너무 어려워요. 전체적으로, 내 게시물보다 훨씬 낫습니다. :-)
Akrikos 09:02

1
"POST 요청은 쿼리 문자열과 요청 본문을 통해 입력을받습니다." IMHO 이것은 잘못되었습니다. 두 입력 중 하나를 사용하려면 $ _REQUEST를 사용해야합니다. $ _POST는 URL 항목을 얻지 못합니다.
Gunnar Bernstein

1
@ Frank Schwieterman이 게시물이 오래되었다는 것을 알고 있지만 계정을 삭제하면 i 등원이 아니며 get을 사용해서는 안됩니다.
frostymarvelous

77

사용자가 양식에 정보를 입력하고 제출을 클릭하면 브라우저에서 서버로 정보를 전송할 수있는 두 가지 방법이 있습니다 (URL 또는 HTTP 요청 본문).

이전 예제에서 사용 된 GET 메소드는 이름 / 값 쌍을 URL에 추가합니다. 안타깝게도 URL 길이는 제한되어 있으므로이 방법은 매개 변수가 거의없는 경우에만 작동합니다. 양식에서 많은 수의 매개 변수를 사용하거나 매개 변수에 많은 양의 데이터가 포함 된 경우 URL이 잘릴 수 있습니다. 또한 URL에 전달 된 매개 변수는 비밀번호를 표시하기에 가장 적합한 브라우저 주소 필드에 표시됩니다.

GET 방법의 대안은 POST 방법입니다. 이 메소드는 HTTP 요청의 본문 내에 이름 / 값 쌍을 패키지하여 URL을 깔끔하게하고 양식 출력에 크기 제한을 두지 않습니다. 또한 더 안전합니다.


1
어떻게 더 "안전"합니까?
Julian Reschke 2009

4
변경하기 어렵 기 때문에? 주소 표시 줄에서 GET을 변경할 수 있지만 POST로는 쉽지 않습니다.
IAdapter 2009

8
서버가 클라이언트를 신뢰할 수 없습니다. 잘못된 가정을 중심으로 응용 프로그램을 설계하는 것은 안전하지 않습니다.
troelskn

openid도 깨질 수 있기 때문에 저장되지 않습니까?
IAdapter

1
나는 이것이 가장 명확한 설명이라고 생각합니다-전송 된 데이터의 배치에 대한 차이점. 감사합니다.
greenoldman

37

가장 좋은 대답은 첫 번째 것입니다.

당신은 사용하고 있습니다 :

  • GET 데이터를 (데이터 가져 오기)를 검색하고자 할 때.
  • POST는 당신이 (POST 데이터) 데이터를 전송하고자 할 때.

2
요청 / 응답 서비스 패턴이 무엇이며 둘 다 수행 하시겠습니까? ;) 응답이 필요한 대부분의 경우 POST를 사용하는 것이 좋습니다.
Dmitry Pavlov

8
일반적으로 그렇습니다. GET데이터를 '송신'할 수 있으므로 매우 정확한 답변은 아닙니다.
Patrick Hofman

23

을 사용하는 데는 일반적인 두 가지 "보안"영향이 GET있습니다. URL 문자열에 데이터가 표시되므로 주소 표시 줄 / URL에서 어깨 너머로보고있는 누군가가 세션을 가로채는 데 사용될 수있는 세션 쿠키와 같이 사소해서는 안되는 것을 볼 수 있습니다. 모든 사람 이 카메라 폰을 가지고 있음 을 명심하십시오 .

다른 보안 의미 는 요청 URL의 일부로 대부분의 웹 서버 액세스 로그에 기록되는 변수 GET와 관련이 있습니다 GET. 상황, 규제 기후 및 데이터의 일반적인 민감도에 따라 잠재적으로 우려가 제기 될 수 있습니다.

일부 클라이언트 / 방화벽 / IDS 시스템은 GET과도한 양의 데이터가 포함 된 요청에 찌그러져 신뢰할 수없는 결과를 제공 할 수 있습니다.

POST 웹 서버에 파일을 업로드하는 데 사용되는 다중 부분 이진 입력 지원과 같은 고급 기능을 지원합니다.

POST제출 된 데이터의 크기가 클라이언트 요청이 독점적으로 단일 패스 증분 모드로 형성되는 것을 미리 방지해야하기 때문에, 애플리케이션 길이 클라이언트는 애플리케이션 특정 클라이언트 구현의 복잡성을 증가시킬 수있는 콘텐츠 길이 헤더를 필요로한다. HTTPRPC (원격 프로 시저 호출) 전송으로 사용하여 악용하려는 사람에게는 사소한 문제 일 수 있습니다.

다른 사람들은 의미상의 차이점과이 질문의 "언제"부분을 다루는 데 이미 좋은 일을 해왔습니다.


17

URL 에서 정보 검색 할 때는 GET을 사용 하고 URL로 정보 보낼 때는 POST 를 사용 합니다.


1
그러나 GET을 사용하여 보낼 수도 있습니다. 차이점은 형식 (URL (GET) 또는 요청 (POST))입니다.
eric

엔드 포인트가 파일을 승인하고 파일에서 행을 리턴하면 (데이터 작성 또는 변경 또는 데이터베이스가 포함되지 않음) 엔드 포인트가 GET 또는 POST 여야합니까?
변수

17

데이터가 많거나 민감한 정보가있는 경우 POST를 사용해야합니다 (실제로 민감한 내용도 보안 연결이 필요합니다).

모든 데이터가 북마크에 포함되므로 사람들이 페이지를 북마크 할 수있게하려면 GET을 사용하십시오.

사용자에게 경고하지 않고 매번 데이터가 다시 전송되므로 GET 메소드를 사용하여 REFRESH를 누르는 사람들을 조심하십시오 (POST는 때때로 사용자에게 데이터 재전송에 대해 경고합니다).


엔드 포인트가 파일을 승인하고 파일에서 행을 리턴하면 (데이터 작성 또는 변경 또는 데이터베이스가 포함되지 않음) 엔드 포인트가 GET 또는 POST 여야합니까?
변수

@variable POST. 이 경우 주로 POST는 파일 업로드를 처리하기 위해 만들어졌으며 표준 GET은 그렇지 않기 때문입니다. 페이지가로드 될 때마다 파일을 보내야하므로 GET + 파일 대신 표준 POST를 사용하는 것이 합리적입니다.
Grant

14

W3C 문서 는 HTTP GET 및 POST 사용에 대해 설명합니다.

나는 그것이 권위있는 출처라고 생각합니다.

요약은 다음과 같습니다 (문서의 섹션 1.3).

  • 상호 작용이 질문과 유사한 경우 GET을 사용하십시오 (예 : 조회, 읽기 조작 또는 조회와 같은 안전한 조작).
  • 다음과 같은 경우 POST를 사용하십시오 .
    • 상호 작용은 주문과 비슷하거나
    • 상호 작용은 사용자가 인식하는 방식 (예 : 서비스 가입)으로 리소스 상태를 변경하거나
    • 사용자는 상호 작용 결과에 대해 책임을 져야합니다.

9
서버 상태가 변경되지 않으면 GET, 변경되면 POST로 요약하면됩니다.
Yamcha

10

Get 및 Post 메소드는 사용하는 서버 기술과 관련이 없으며 php, asp.net 또는 ruby에서 동일하게 작동합니다. GET 및 POST는 HTTP 프로토콜의 일부입니다. 표시된 바와 같이 POST가 더 안전합니다. POST 양식도 브라우저에 의해 캐시되지 않습니다. POST는 대량의 데이터를 전송하는 데에도 사용됩니다.


8

데이터를 변경할 때 POST를 사용하는 이유 :

  • Google Web Accelerator와 같은 웹 가속기는 페이지에서 모든 (GET) 링크를 클릭하여 캐시합니다. 링크가 내용을 변경하면 매우 나쁩니다.
  • 브라우저는 GET 요청을 캐시하므로 사용자가 링크를 클릭하더라도 변경 사항을 실행하기 위해 서버에 요청을 보내지 않을 수 있습니다.
  • CSRF로부터 사이트 / 애플리케이션을 보호하려면 POST를 사용해야합니다. 앱을 완전히 보호하려면 서버에서 고유 식별자를 생성하여 요청과 함께 보내야합니다.

또한 주소 표시 줄, 책갈피 및 서버 로그에 표시되므로 민감한 정보를 쿼리 문자열에 넣지 마십시오 (GET 옵션 만 해당).

희망적으로 이것은 사람들이 POST가 '안전하다'고 말하는 이유를 설명합니다. 민감한 데이터를 전송하는 경우 SSL을 사용해야합니다.


8

GETPOSTHTTP 방법을하는 비슷한 목표를 달성

GET다만 A는, 데이터를 (검색) 얻기를 위해 기본적으로 GET그렇게 옆 쿠키에서, 몸이 안, 정보를 전달할 수있는 유일한 장소는 URL에 및 URL의 길이가 제한됩니다 GET덜에 비해 안전한 POST데이터하여 전송이의 일부이기 때문에 URL

GET비밀번호, 신용 카드 또는 기타 민감한 정보를 보낼 때 사용하지 마십시오 !, 데이터는 URL의 모든 사용자에게 표시되며, 데이터를 캐시 할 수 있습니다. GET우리가 다시로드하거나 버튼을 다시 호출 할 때 무해합니다. 책이 표시되고 매개 변수는 브라우저 기록에 남아 있으며 ASCII 문자 만 허용됩니다.

POST데이터 저장 또는 업데이트, 제품 주문 또는 이메일 전송과 같은 모든 것이 포함될 수 있습니다. POST방법에는 본문이 있습니다.

POST중요한 기밀 정보를 서버로 전달하기위한 방법이 보안되어 URL의 쿼리 매개 변수에 표시되지 않으며 매개 변수는 브라우저 히스토리에 저장되지 않습니다. 데이터 길이에는 제한이 없습니다. 우리가 다시로드 할 때 브라우저는 데이터를 다시 제출하려고한다는 것을 사용자에게 경고해야합니다. POST메소드를 북마크 할 수 없습니다


3
  1. GET 방법은 덜 민감한 데이터를 전송하는 데 사용되고 POST 방법은 민감한 데이터를 전송하는 데 사용됩니다.
  2. POST 방법을 사용하면 GET 방법에 비해 많은 양의 데이터를 보낼 수 있습니다.
  3. GET 메소드로 전송 된 데이터는 브라우저 헤더 표시 줄에 표시되지만 POST 메소드로 전송 된 데이터는 표시되지 않습니다.

0

URL에서 자원을 검색하려면 GET 메소드를 사용하십시오. 브라우저의 뒤로 버튼을 누르면 항상 마지막 페이지를 볼 수 있고 책갈피를 지정할 수 있으므로 POST 방법만큼 안전하지 않습니다.

URL에 무언가를 '제출'하려면 POST 방법을 사용하십시오. 예를 들어 Google 계정을 만들고자하는 경우 자세한 정보를 모두 입력 한 다음 제출 후 '제출'버튼 (POST 방법이 여기에 호출 됨)을 누르고 성공적으로 제출 한 후 브라우저의 버튼을 누르십시오. 양식이 채워진 마지막 페이지 대신 오류 또는 새 빈 양식이 표시됩니다.


-10

GET방법 :

  • 256 자 날짜 전송에만 사용됩니다.

  • 이 방법을 사용하면 브라우저에서 정보를 볼 수 있습니다

  • 양식에서 사용하는 기본 방법입니다

  • 그렇게 안전하지 않습니다.


POST방법 :

  • 무제한 데이터 전송에 사용됩니다.

  • 이 방법을 사용하면 브라우저에서 정보를 볼 수 없습니다

  • POST메소드를 명시 적으로 언급 할 수 있습니다

  • GET방법 보다 더 안전합니다

  • 보다 고급 기능을 제공합니다


"256 자 날짜를 보내는 데만 사용됩니다"– 사실이 아닙니다. "이 방법을 사용하면 브라우저에서 정보를 볼 수 있습니다"– 포스트 데이터도 브라우저에서 볼 수 있지만 그렇게 명확하지는 않습니다. "보다 고급 기능을 제공합니까?"
Quentin

이것은 매우 유용한 답변이 아닙니다. '안전하지 않습니다'및 '고급 기능 제공'과 같은 잘못된 정보 및 Quentin이 언급 한 기타 정보.
Andrew Barber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.