GET 방법과 POST 방법의 다른 실제 느낌의 실험

왜 실험을 했어요?


후배한테 물어서 복습을 해 봤어요.정답을 알고 싶은 사람은 RFC 7231에 기재된 내용을 읽으십시오.그게 최고야.다음은 나의 실험과 농담.
요컨대 GET는 참고로 사용되고 POST는 기밀 정보를 업데이트하고 발송하는 인상에 사용되지만 하고 싶다면 정반대로도 가능하다.근데 이거 엉망이야.HTTP는 응용 프로그램뿐만 아니라 브라우저와 중간부품도 관련되어 각자 의식적으로 규칙을 제정한다.여러분(브라우저와 중간부품 중의 사람들)은 각자의 방법을 어떻게 구분하는지 실험을 진행하여 구체적으로 확인했습니다.

실험


실험 1 매개 변수 처리의 차


GET는 기본적으로 매개변수를 질의 문자열에 포함합니다.다른 한편, POST는 파라미터를 포함한 신체 요구를 사용할 수 있다.한 페이지에서 시작하여 매개 변수와 함께 다른 페이지로 이동할 때 일반적으로 다음과 같은 HTML을 사용합니다.
GET의 경우
<html><body>
  <a href="/?queryparam=123">Lets go!</a>
</body></html>
POST의 경우
<html><body>
<form action="/" method="POST">
  <input name="bodyparam" value="123">
  <input type="submit" value="Lets go!">
</form>
</body></html>
에 보낸 요청은 다음과 같습니다.(주요 부분만 발췌)
GET의 경우
GET /?queryparam=123 HTTP/1.1
Host: example.com
POST의 경우
POST / HTTP/1.1
Host: example.com

bodyparam=123
및 검색 문자열에 포함된 파라미터는 주체에 포함된 파라미터와 처리가 다르다.얼렁뚱땅 말하자면 전자는 사용하기에 매우 가볍고 후자는 비밀 정보를 보호한다.예를 들어 웹 서버의 로그는 이렇습니다.요청에 포함된 매개 변수는 로그에 저장하는 방법을 각각 확인합니다.
nginx 접근 로그에 다음 출력이 있습니다.
10.30.1.1 - - [03/Dec/2020:10:39:26 +0000] "GET /?queryparam=123 HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0" "-"
10.30.1.1 - - [03/Dec/2020:10:39:26 +0000] "POST / HTTP/1.1" 405 157 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0" "-"
다음은 아파치.
10.30.1.1 - - [06/Dec/2020:19:37:54 +0900] "GET /?queryparam=123 HTTP/1.1" 200 552 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"
10.30.1.1 - - [06/Dec/2020:19:37:54 +0900] "POST / HTTP/1.1" 200 552 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"
IIS에서는 이렇습니다.
2020-12-25 08:48:40 127.0.0.1 GET / queryparam=123 443 - 127.0.0.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/87.0.4280.88+Safari/537.36 https://getpost.example.com/logcheck.html 200 0 0 1346
2020-12-25 08:48:43 127.0.0.1 POST / - 443 - 127.0.0.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/87.0.4280.88+Safari/537.36 https://getpost.example.com/logcheck.html 200 0 0 3
보시다시피queryparam은 잘 보존되어 있지만bodyparam은 그림자도 모양도 없습니다.즉, GET의 매개변수에 암호와 개인 정보가 포함되어 있으면 기본적으로 엔티티가 있는 레코드 파일로 저장됩니다.사이트 운영자가 일지를 확인하면 이걸 볼 수 있어요.또 서버가 취약해 외부에서 로컬 파일을 열람한 경우 공격자가 되어 기밀 정보를 얻는 데 큰 도움을 준다.POST는 신체에 매개 변수를 갖출 수 있기 때문에 웹 애플리케이션에서 의도적으로 출력하지 않으면 이런 문제가 발생하지 않을 것이다.
하지만 이런 HTML은 어떨까.이것은 흔히 볼 수 있는 물건이다.
<html><body>
<form action="/?postqp=abc" method="POST">
  <input name="postbp" value="123">
  <input type="submit" value="Lets go!">
</form>
</body></html>
HTTP 요청이 전송되었습니다.
POST /?postqp=abc HTTP/1.1
Host: example.com

bodyparam=123
검색 문자열과 몸에 파라미터가 있습니다.검색 문자열 부분은 로그에 저장됩니다.다음은 Apache의 로그입니다.
10.30.1.1 - - [25/Dec/2020:09:43:42 +0900] "POST /?postqp=abc HTTP/1.1" 200 552 "http://10.30.1.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
검색 문자열의 매개 변수가 로그에 저장됩니다.POST나 GET이라서가 아니라
다음에form 탭의method 속성을 GET로 설정하면 어떨까요?이거 잘 안 보여요.아니면 못 봤다거나.
<html><body>
<form action="/?getqp=abc" method="GET">
  <input name="getbp" value="123">
  <input type="submit" value="Lets go!">
</form>
</body></html>
GET도 POST처럼 몸에 파라미터를 갖춰서 보낼 수 있을까.그런 일 없습니다.이 HTML을 열고 단추를 눌렀을 때 브라우저가 이런 요구를 보냈습니다.
GET /?getbp=123 HTTP/1.1
Host: 10.33.2.76
검색 문자열의 getqp=abc가 사라지고 getbp=123에 덮어씁니다.브라우저(Chrome)는 GET의 바디로 전송되지 않습니다.일지에 남는 것도 당연히 후자다.
10.30.1.1 - - [25/Dec/2020:09:46:57 +0900] "GET /?getbp=123 HTTP/1.1" 200 552 "http://10.30.1.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
왜 그랬는지 말하자면, 나는 MDN에 잘 썼다[1].
get: HTTP GET 메서드에 해당합니다.양식 데이터액션 속성의 URI에 중간자로 추가한 다음 결과 URI를 서버에 보냅니다.
브라우저는 단지 이렇게 작동할 뿐이다.method 없이 기본값은 GET입니다.
지금까지의 결과에서 다음과 같은 결론을 얻을 수 있다.
POST는 매개변수 처리에 따라 GET보다 기밀 정보를 보내기에 적합하지만 요청한 바디 섹션에서 보내야 합니다.

실험2 쿠키의 사용 차이


HTTP 쿠키에는 SameSite 속성이 있습니다.이것은 추가 쿠키가 제3자의 요청을 보낼지 안 보낼지 지정할 수 있습니다.이'제3자'는 이해하기 어려운데 십자 사냥꾼자리처럼 다른'시트[2]'의 요구에서 나온 것이다."Site"와 우리가 평소에 말한 "사이트"의 뜻이 다소 다르다는 것을 주의하세요.자세한 내용은 바닥글의 링크 주소를 참조하십시오.
또한 SameSite의 속성에는 None, Lax, Strict 세 가지 값이 있으며, Lax는 GET나 POST에 따라 동작이 달라집니다.
MDN[3]에서
타사 웹 사이트에서 시작한 GET 요청과 함께 발송합니다.
.GET가 명확하게 쓰여 있기 때문에 GET나 POST의 사용 방법은 다르다.
이번에는 SameSite 속성이 Lax와 Strict인 쿠키 2종을 설정해 서버에 보낼지 시도했다.
헤더의 정보를 보기 위해 서버는 다음 PHP를 실행합니다.이것은 요청 헤더에 포함된 쿠키를 표시하는 간단한 것일 뿐입니다.
testphp.php
<body>
<pre>
<?php
echo "メソッド-> " . $_SERVER["REQUEST_METHOD"] . "\n";
echo "サーバで受け取ったCookie" . "\n";
print_r($_COOKIE);
?>
</pre>
</body>    
고객의 경우 쿠키를 미리 설정합니다.방법은 여러 가지가 있는데 이번에는 개발자 도구를 사용했다.

쿠키 TestLax의 SameSite 속성 값은 Lax이고 쿠키 TestStrict의 Strict는 이름에 따라 2개의 쿠키가 설정됩니다.이 상태에서 타사 도메인의 HTML 파일에서 웹 서버로 요청을 전송합니다.
발송원:src.example.jp

발송 주소.example.com/testcook.php
TLD가 다릅니다.getpost.example.jp가 된 경우 오리온과 다르지만 쿠키로서 다른 시트로 간주되지는 않는다.
그나저나 이 실험을 위해 서버 두 대를 만들 필요는 없다.hosts를 편집하여 두 도메인에 동일한 IP를 설정하기만 하면 됩니다.
GET의 경우 결과는 이쪽입니다.

SameSite 속성 값은 Lax 값으로만 전송됩니다.
POST의 경우 결과는 이렇습니다.

렉스 물건도 보내지 않았어.
SameSite 속성의 값이 Lax인 경우 GET나 POST에서 쿠키의 사용이 다릅니다.또한 일부 브라우저에서 SameSite 속성을 지정하지 않으면 Lax로 처리됩니다.
그나저나 SameSite 속성으로 보내지 않은 쿠키는'보내지 않음'만 있고 JavaScript(HttpOnly 속성이 없는 경우)에서는 정상적으로 접근할 수 있다.쉽게 보려면 PHP에서 만든 페이지의 HTML 섹션에 스크립트 태그를 추가합니다.
<script>document.write("JavaScriptから見えるCookie<br>" + document.cookie);</script>
GET

POST

스트리트도 나왔네.

기타: 클론 동작


사실 이것도 실험하고 싶었지만 구글이 아무리 해도 자신의 웹사이트에 자유형을 주지 않기 때문에 포기했다.
Googlebot과 같은 기어오르기는 GET와 POST를 구분할 수 있습니다.클론 사용자는 POST 방법을 통해 요청을 자동으로 보내기를 원하지 않습니다[4].데이터 삭제가 발생한 곳을 GET 기능대로 구현하면 클론 때문에 전멸할 가능성이 크다.이러면 위험해.다만 Googlebot에서 POST 요청[5]을 조건부로 보내면 GET처럼 무조건 보내지 않는 것 같습니다.
데이터베이스 쓰기와 메일 발송 등 복제되면 안 좋은 일이 발생할 수 있는 기능을 POST로 활용하자.

결론


브라우저와 서버가 GET나 POST에 따라 사용 방법을 바꾼 점을 잘 아실 거라고 생각합니다.이런 것들에 신경 쓰지 않아도 앱을 만들면 안 되는 것도 아니고 분쟁의 근원이 될 뿐이죠.규정을 지켜라.
각주
- HTML: HyperText Markup Language | MDN
https://developer.mozilla.org/ja/docs/Web/HTML/Element/form ↩︎
Site(사이트) MDN 웹 Docs 용어집: 웹 관련 용어의 정의 | MDN
https://developer.mozilla.org/ja/docs/Glossary/Site ↩︎
SameSite cookies - HTTP | MDN
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie/SameSite ↩︎
복제 해커가 모든 사이트를 복제하는 실천 기교
죽첨직수, 섬본다코자, 전소준우, 하기우야 귀탁, 천상복숭아
상영회사https://www.shoeisha.co.jp/book/detail/9784798150512↩︎
Google 웹 스타를 위한 공식 블로그[JA]: 검색 결과: 클론은 POST에서 더 많은 유익한 콘텐츠를 팟캐스트할 수 있음
https://webmaster-ja.googleblog.com/2012/01/post.html ↩︎

좋은 웹페이지 즐겨찾기