get, post

EJ·2021년 1월 7일
0

기술 공부

목록 보기
4/18

HTTP

HTTP는 웹 상에서 클라이언트와 서버 간에 요청/응답으로 데이터를 주고 받을 수 있는 프로토콜이다. HTTP 요청에는 HTTP 메소드가 포함된다. HTTP 메소드는 서버가 요청을 수행하기 위해 해야할 행동을 표시하는 용도로 사용한다. HTTP 메소드 중 가장 일반적인 두 가지가 GET과 POST이다.

HTTP 메서드 종류

  • GET
  • POST
  • PUT
  • HEAD
  • DELETE
  • PATCH
  • OPTIONS

GET

GET은 서버로부터 정보를 조회하기 위해 설계된 메소드이다.

GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송한다.

쿼리스트링을 사용하게 되면 url에 조회 조건을 표시하기 때문에 특정 페이지를 링크하거나 북마크 할 수가 있다.

쿼리스트링이란?
사용자가 입력 데이터를 전달하는 방법 중 하나로, url 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것을 말한다.

http://host:port/path?querystring

query parameters(물음표 뒤에 =로 연결된 key value pair부분)를 url 뒤에 덧붙여서 추가적인 정보를 서버 측에 전달한다. 클라이언트가 어떤 특정 리소스에 접근하고 싶어하는지에 대한 정보를 담는다.

  • ?를 쓰는 것으로 쿼리스트링이 시작함을 알린다.
  • 파라미터가 여러 개일 경우 &를 붙여 여러 개의 파라미터를 넘길 수 있다.
    엔드포인트주소/엔드포인트주소?파라미터=값&파라미터=값
  • =로 key와 value가 구분된다.

GET은 불필요한 요청을 제한하기 위해 요청이 캐싱될 수 있다.
JS, CSS, 이미지 같은 정적 컨텐츠는 데이터양이 크고 변경될 일이 적어서 반복해서 동일한 요청을 보낼 필요가 없다. 따라서, 정적 컨텐츠를 요청하고 나면 브라우저에서는 요청을 캐시해두고, 동일한 요청이 발생할 때 서버고 요청을 보내지 않고 캐시된 데이터를 사용한다.

프론트엔드 개발을 하다보면 정적 컨텐츠가 캐시되어 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 종종 발생한다. 이럴 경우 브라우저의 캐시를 지워주면 다시 컨텐츠를 조회하기 위해 서버로 요청을 보내게 된다.

(open api스터디에서 네이버 영화 api를 사용했을 때 캐싱이 발생해 검색이 제대로 되지 않았던 기억이 난다.)


POST

POST는 리소스를 생성/변경하기 위해 설계되었다. 때문에 GET과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송한다.

HTTP 메세지의 Body는 길이의 제한 없이 데이터를 전송할 수 있다. 그렇기 때문에 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다.

이처럼 POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않기 때문에 GET보다 보안적인 면에서 안전하다고 생각할 수 있다. 하지만 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 한다.

POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터 타입을 표시해야 한다. 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 표함된 리소스의 확장자명 등으로 데이터 타입을 유추하게 된다. 만약, 알 수 없는 경우에는 application/octct-stream으로 요청을 처리하게 된다.

application/octet-stream
해당 컨텐츠 타입(Content-type)의 MIME 형식이다. 서버에서 다루는 확장자명이 어떤 형식의 자료인지 알려주는 것으로, octet-stream은 8비트로 된 데이터라는 뜻이다.
octet-stream은 이 파일을 다룰 특별한 프로그램이 없다는 뜻도 될 수 있다.

MIME
Multipurpose Internet Mail Ectensions의 약자로 파일 변환을 뜻한다.


GET과 POST의 차이

GET은 Idempotent, POST는 Non-idempotent하게 설계되었다.

Idempotent멱등이라는 말로, 수학적인 개념이다. 수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라고 결과가 달라지지 않는 성질을 의미한다.

즉, 멱등은 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야 한다.

GET은 Idempotent하도록 설계되었기 때문에, GET으로 서버에 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아오게 된다. 따라서 GET은 설계원칙에 따라 서버의 데이터나 상태를 변경시기키 않아야하기 때문에 주로 조회를 할 때 사용한다. 예를 들면, 브라우저에서 웹페이지를 열어보거나 게시글을 읽는 등의 조회하는 행위를 GET으로 요청하게 되는 것이다.

POST는 Non-indempotent하기 때문에 서버에 동일한 요청을 여러 번 전송해도 응답이 항상 다르게 나올 수 있다. 따라서 POST는 서버의 상태나 데이터를 변경시킬 때 사용하게 된다.
게시글을 쓰면 서버에 게시글이 저장되고, 게시글을 삭제하면 해당 데이터가 없어지는 등 POST로 요청을 하게 되면 서버의 무언가는 변경되게 된다.

POST는 생성, 수정, 삭제에 모두 사용할 수 있지만 더 정확히는, 생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메소드라고 할 수 있다.

따라서 GET과 POST는 설계원칙에 따라 적절한 용도로 사용해야 한다.



💡 요약
GET과 POST는 HTTP 메소드이다. HTTP는 웹 상에서 클라이언트와 서버 간에 응답/요청을 통해 데이터를 주고 받는 프로토콜로, HTTP 요청에 HTTP 메소드가 포함되는 것이다.

GET은 서버로부터 정보를 조회하기 위한 메소드이다. 요청을 전송할 때 필요한 데이터를 HTTP 메세지의 Body가 아닌 쿼리스트링을 통해 전달하게 된다. 쿼리스트링을 사용하기 때문에 url에 조회 조건을 표시하게 되고, 특정 페이지를 링크하거나 북마크 할 수 있다.
GET은 불필요한 요청을 제한하기 위해 캐싱이 될 수 있다. css, 이미지와 같은 정적 컨텐츠의 경우 데이터양이 크기 때문에 한 번 요청시에 브라우저에 요청을 캐시해두고, 동일한 요청이 발생하면 서버로 요청을 보내기 않고 캐시된 데이터를 사용하게 된다.

POST는 리소스를 생성/변경하기 위해서 설계되었다. 따라서 HTTP 메세지의 Body에 전송해야할 데이터를 담아서 전송한다. HTTP 메세지의 Body는 길이 제한이 없기 때문에 데이터를 제한 없이 전송할 수 있다. 그렇기 때문에 POST 요청은 대용량 데이터를 전송할 수 있다. POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않기 때문에 보안적인 면에서 안전하다고 생각할 수 있으나, 크롬의 개발자 도구 등으로 요청 내용을 확인할 수 있기 때문에 민감한 데이터는 암호화해서 전송하는 것이 좋다.

이처럼 GET과 POST는 동일한 요청에 어떤 응답을 가져오느냐에서 차이가 있다.
GET은 동일한 요청을 할 경우 언제나 동일한 응답이 돌아오게 된다. 그렇기 때문에 GET은 상태를 변경시키지 않아야 하는 조회를 할 때 주로 사용된다.
POST는 서버에 동일한 요청을 해도 응답이 항상 다르게 돌아올 수가 있다. 따라서 POST는 서버의 상태나 데이터를 변경할 경우에 사용하게 된다.

따라서 GET과 POST는 설계원칙에 따라 적절한 용도로 사용을 해야 한다.

profile
주니어 프론트엔드 개발자 👼🏻

0개의 댓글