Kraken-Addicts/HTTP-The-Definitive-Guide

Q1) GET vs POST (Interview Question in HTTP)

Opened this issue · 8 comments

GET과 POST에 대해 설명하고 그 차이점에 대해 말씀해주세요. (엄근진 😶)

GET과 POST 모두 HTTP에서 사용되는 request methods(요청 메소드) 입니다. 다른 말로 HTTP 동사라고도 하죠.
HTTP에서 무언가 하기 위해선 필수적으로 필요한 문법입니다.
메소드를 통해서 클라이언트는 서버에게 어떤 요청을 할 수 있고 서버는 그에 따른 응답을 해주어 클라이언트는 자신이 원하는 결과를 보거나 수정, 삭제 할 수 있습니다.

그 중 GET 메소드는 일반적으로 가장 많이 사용되는 메소드인데 이는 URL 형식으로 웹서버의 리소스(데이터)를 요청하는 메소드입니다.
예를 들어 네이버 메인 웹 페이지를 보고 싶을 때 www.naver.com URL로 GET 요청 메소드를 통해 네이버 서버에 요청하고
네이버 서버는 클라이언트의 GET 요청에 따라 서버 리소스 www.naver.com/index.html을 클라이언트에게 보내줍니다.
클라이언트는 그 결과를 볼 수 있는 것이죠. 만약 네이버에서 로그인을 하고 싶을 땐 어떻게 해야 할까요?

이때 사용되는 메소드가 POST 메소드입니다. 클라이언트가 서버에게 내용이나 파일을 전송할 때 사용하죠
예를 들어 GET 요청을 통해 네이버 메인 페이지를 보고 있습니다. 이 때 로그인이 하고 싶다면 id와 pw를 입력하고 로그인 버튼을 누르는 순간 id와 pw는 네이버 서버에 보내지게 되는 것이죠. 이 때 클라이언트가 서버에게 보낼 때 사용되는 메소드가 POST 메소드입니다.

차이점으로는 GET은 요청 메세지의 헤더, URL로 모든 정보를 요청하고 POST는 요청 메세지의 바디에 해당 내용을 담아 요청합니다.
또한 GET은 여러번 요청해도 항상 같은 결과를 응답받고(멱등함) POST는 응답 결과가 변할 수 있습니다

🦊 HTTP Method

  • 서버에게 무엇을 해야하는지 알려줌
  • HTTP 요청의 명령어라고 생각하면 편함
  • GET, HEAD, POST, PUT, PATCH, DELETE등이 있음
    • 서버가 모든 METHOD를 다 사용할 필요는 없음

🦊 GET Method

  • 정보를 조회하는 목적(변경 X)
    • 서버의 어떤 작용도 할 수 없으므로 안전한 Method임(안전한 Method에는 HEAD, GET이 있음)
  • 모든 정보를 URL로 보냄
    • 즉 HTTP Header에 정보가 담김, HTTP Body 사용 X
  • URL에 정보가 다 담겨있으므로 URL만 알면 할 수 있는것들을 할 수 있음
    • 캐시 가능
    • 브라우저 History에 남음
    • 북마크 가능
  • URL은 브라우저별로 길이의 제한이 있음
  • URL에 정보가 담기므로 쿼리스트링이나 Clean URL방식 등을 이용해서 키,값 쌍의 정보를 넘겨줌
쿼리 스트링 Clean URL(Semantic URL)
http://example.com/index.php?page=foo http://example.com/foo
http://example.com/index.php?page=consulting/marketing http://example.com/consulting/marketing
http://example.com/products?category=2&pid=25 http://example.com/products/2/25
http://example.com/cgi-bin/feed.cgi?feed=news&frm=rss http://example.com/news.rss
  • Idempotent(멱등성): 여러번 요청해도 결과가 변하지 않음

🦊 POST Method

  • 정보를 생성 및 수정하는 목적(조회도 가능)
  • HTTP Body에 정보를 담아서 보냄(HTML Form에 담겨서 HTTP Body를 통해 서버로 보냄)
    • Body에 담기므로 URL에 정보가 노출 되는 GET 요청과는 달리 기본적인 보안이 가능
    • HTTPS를 사용하여 더 강화된 보안도 가능
    • BODY에는 길이의 제한이 없음. 따라서 무제한 길이의 정보를 보낼 수 있음
  • Non-idempotent(비멱등성): 요청할 때마다 결과가 같지 않음. 글을 생성하는 POST요청의 경우 요청 할 때마다 새로운 글이 생김

🦋 GET

서버에서 특정 데이터를 가져와서 보여주는 용도

  • 요청을 전송할 때 필요한 데이타를 쿼리스트링을 통해 전송
    • 전송 길이 제한O
    • URL에 조회 조건을 표시하기 때문에 특정 페이지 링크or북마크 가능
    • 링크에 정보가 바로 보여 보안에 취약
    • URL뒤 ? 뒤에 전송할 데이타 입력
    • 데이타표현은 key와 value를 쌍으로 작성 (key1=value1&key2=value2)
  • 멱등(idempotent) - 동일한 요청을 여러 번 해도 동일한 응답이 돌아온다
    • 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다
  • 한 번 요청한 것은 캐싱해두어 재요청 시 POST보다 빠르다
    • 이미지같은 정적 컨텐츠는 캐시해둔다.
      • 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 종종 발생해 이 때는 캐시를 지워 변경된 컨텐츠를 새로 요청해야 볼 수 있다

🦋 POST

서버의 값이나 상태를 바꾸어 데이타베이스값을 추가하거나 수정하는 것

  • 많은 양의 데이터를 보낼 수 있다 (대용량 데이타 전송 가능)
  • 데이타를 body로 전송
    • 요청 데이타가 body에 있기 때문에 링크가 따로 없다 (북마크X)
  • 비멱등(non-idempotent) - 동일한 요청을 전송해도 응답이 항상 다를 수 있다
  • 생성, 수정, 삭제에 사용 가능하지만 수정과 삭제는 다른 메소드를 사용하는 것이 좋다
    • 생성은 POST
    • 수정은 PUT or PATCH
    • 삭제는 DELETE
  • GET요청처럼 URL에서 바로 데이타를 볼 수는 없지만 body를 열어서 내용을 볼 수 있다 (보안 필요)

GET POST
URL에 데이터 노출 노출O 바디에 담겨있어 URL엔 노출X
URL예시 http://localhost/getexample?id=jehong&password=secret http://localhost/postexample
데이터가 포함되는 위치 Header에 데이타 포함 Body에 데이타 포함
북마크 가능 여부 북마크O 북마크X
데이타 전송 길이 제한 제한O 대용량 데이타 전송 가능
캐싱 가능 여부 캐싱O 캐싱X
멱등(동일한 요청에 동일한 응답) 동인한 요청에 동일한 응답 동일한 요청에 다른 응답

(즉석)
GET과 POST 모두 클라이언트가 서버로 요청을 보낼 때 사용하는 HTTP 메서드입니다.
GET은 CRUD의 R 즉, 리소스의 조회를 할 때 사용하고,
POST는 CRUD의 C 즉, 리소스를 생성해서 서버에 저장할 때 사용합니다.

(보충)
POST의 경우 GET과 달리 바디에 내용을 담아 보낼 수 있어, 단순히 URL로 리소스를 요청하는 GET 뿐만 아니라 대부분의 메서드를 대체할 수 있지만
특별한 경우가 아니라면 각각의 메서드에 맞는 역할로 사용하는 것이 좋습니다.
(POST, GET, PUT, DELETE 이 4가지의 Method를 가지고 CRUD를 할 수 있습니다.)

GET, POST라는 HTTP메소드를 통해 서버에 요청을 보내고 이에 대한 응답을 받을 수 있습니다.

GET요청은 주로 조회의 목적으로 URL와 쿼리스트링을 함께 서버에 전송해 이에 대한 응답을 받습니다. 예를들어 게시글 중 3번을 보고싶을 때 게시판.com/게시글?postId=3 처럼 ? 뒤에 이름, 값을 가지고 조건을 주어 요청을 전송할 수 있습니다. 데이터를 URL에 붙여 전송하므로 전송길이에 제한이 있습니다. GET에 대한 응답은 항상 같습니다.

POST요청은 생성, 변경의 목적으로 GET과 달리 URL에 데이터를 붙이지 않고 메시지의 body에 담아서 전송해서 길이제한이 없습니다. 응답이 GET과달리 항상 같지 않습니다.

둘 다 클라이언트가 서버에게 사용하는 요청 메시지의 메서드 중 하나로, 요청하는 내용/목적/특징에 따라 메서드를 정해 사용하면 이에 따라 응답 코드(+ 요청한 내용에 맞는 데이터)를 포함한 응답 메시지를 받게 됩니다.

GET는 이 페이지의 7번 카테고리 21번 제품을 보여줘! 처럼 클라이언트가 정보를 받을 때 쓰고, POST는 말 그대로 블로거가 새로운 글을 쓰기 위해 내용을 적고 포스팅 버튼을 누를 때처럼, 클라이언트의 데이터를 서버로 보낼 때 (그래서 서버의 어느 리소스를 생성하거나 변경할 때) 주로 쓰입니다.

GET은 POST에 비해 정보 조회에 용이합니다.
URL에 필요한 내용을 모두 담아 요청하기 때문에 비교적 구체적인 내용을 쿼리스트링을 통해 요청할 수 있습니다.
항상 같은 결과를 보장(멱등)하기 때문에, 캐싱이 가능해서 더 빨리 로드할 수 있다는 장점이 있습니다. 유의할 부분은 URL 길이에 한계가 있다는 점(브라우저 별로 제한이 다름)인데, HTTP 메시지의 헤더만 사용하여 정보가 전달되기 때문이고, POST는 바디에 데이터를 담아 전달하기 때문에 전송 정보량에 한계가 없다는 점이 GET과 크게 다른 점 입니다. 그래서 POST는 정보 전송에 더 용이합니다.

GET과 POST는 둘다 HTTP 메소드로서 클라이언트가 서버어게 요청을 수행하기 위해 할 행동을 표시해주는 역할을 하는데
주로 GET은 가져오는 역할, 즉 서버로부터 정보를 조회하는 메소드이고, POST는 서버의 리소스를 생성/변경하는 메소드입니다.
둘의 차이로는 데이터 위치, URL에 데이터 노출 여부, 캐싱여부가 있는데
데이터위치는 GET은 Header에 쿼리스트링으로 저장되고 POST는 body에 저장됩니다. GET은 쿼리스트링 형식으로 저장되기 때문에 데이터 용량한계가 있고 POST같은 경우에는 body에 저장되기 때문에 대용량으로 데이터를 보낼 수 있습니다.
두번째 URL에 데이터 노출 여부는 GET 같은 경우에는 URL에 쿼리스트링이 보임으로 어떤 인자들을 전송했는지 노출이 되지만 POST 같은 경우에는 body를 통해 데이터를 전송함으로 URL에 데이터 노출이 되지 않습니다. 여기서 이렇게 보면 GET보다는 POST가 보안이 조금 낫다고 할 순 있지만 POST의 body에 있는 데이터도 좀만 노력하면 노출될 수 있기 때문에 민감한 정보는 반드시 암호화를 해야한다는 점을 유의해야합니다.
마지막으로 캐싱여부에서 GET은 캐싱이 되고 POST는 캐싱이 안되는데 이는 두 메소드의 멱등성과도 관련이 있습니다. GET 같은 경우에는 멱등하게, 즉 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답을 돌아오도록 설계되어 있기 때문에 같은 응답이 올것을 가정하기 때문에 캐싱이 가능합니다. (또한 불필요한 요청을 제한하기 위해서도) 반대로 POST는 비멱등함으로써 서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있으므로 캐싱이 불가능하다는 특징을 가지고 있습니다.


HTTP

HTTP는 클라이언트와 서버간에 요청/응답으로 데이터를 주고 받을 수 있는 프로토콜이다. 이때 HTTP요청에 포함되는 HTTP메소드는 서버가 요청을 수행하기 위해 해야할 행동을 표시하는 용도로 쓰인다. 이 HTTP 메소드 중 GET과 POST의 특징과 차이점

GET

  1. brief : 가져온다 - 서버로부터 정보를 조회하기 위해 설계된 메소드.
  2. 데이터 위치 : Header (여기에 URL형식으로 저장되어 보내짐)
  3. URL에 데이터 노출 여부 : O - 쿼리 스트링으로 전송한다. (보안에 취약하지만 상세한 링크 공유 장점)

ex) www.example.com/resources?name1=value1&name2=value2

  1. 캐싱 여부 : O - 멱등하다.(서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야 한다) + 불필요한 요청을 제한하기 위해서

POST

  1. brief : 수행한다 - 리소스를 생성/변경하기 위해 설계되었다.
  2. 데이터 위치 : Body (+URL이 아닌 Body에 담아 보내기 때문에 대용량 데이터를 전송할 수 있다.)
  3. URL에 데이터 노출 여부 : X - 전송될때 내용이 눈에 안 보이지만(URL에) 보안이 좋은건 아님 민감한 정보는 꼭 암호화를 하자.
  4. 캐싱 여부 : X - 비멱등하다.(서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있습니다.)

Q

  • GET이 Header에 정확히 어떤 형식으로 저장되는지, 용량은 얼만큼 저장할 수 있는지?
  • 왜 body에 저장하면 대용량으로 데이터를 보낼 수 있는지?
get post
정보 조회 목적 리소스 변경 목적
안전 안전하지 않음
캐시가능 캐시불가
멱등성 멱등하지 않음
데이터가 url 쿼리스트링에 담김 데이터가 요청메세지 본문 body에 담김