GET 메소드

- 쿼리스트링으로 정보를 보내는데, 이 때 파라미터는 다 노출되기 때문에 GET 요청에서 중요한 정보를 다루면 안된다.

- GET 요청은 브라우저 기록이 남는다.

- GET 요청은 북마크할 수 있다. 

- GET 응답은 캐싱될 수 있다.

- GET 요청의 URI+Query String이 최대 256자 길이 제한이 있다는 말을 자주 볼 수 있는데, 사실이 아니다.

 HTTP 자체는 요청 길이에 대한 제한을 두지 않는다. 다만 브라우저에는 길이 제한이 있다. (브라우저마다 다르다.)

 

참고로 서버에서는 요청 URI의 길이가 너무 길 경우 414 코드를 반환할 수 있다.

 

POST 메소드

- POST 요청은 캐싱되지 않는다.

- POST 요청은 브라우저 기록에 남지 않는다.

- POST 요청은 북마크에 추가할 수 없다.

- GET 요청과 달리 데이터를 body에 담아서 보내기 때문에 외부에 드러나지 않아 보안적인 측면에서 GET보다 조금 낫다. (하지만 데이터를 암호화 하지 않으면 Body 의 데이터도 결국 볼 수 있는 건 똑같다.)

 

주요 차이점

우선은 쓰임이 다르다. GET은 서버의 리소스를 받아오는 일이고, POST는 서버의 리소스를 생성하거나 등록하는 일이다.

GET은 쿼리스트링을 활용하기에 캐싱을 하거나 브라우저에 기록이 남거나 북마크를 할 수 있는 것이고, POST는 전달하는 data가 노출되지 않기에 캐싱이나 북마크 또한 불가능한 것이다.

 

HTML의 form 태그를 사용할 때 get 메소드를 사용하면 모든 form data는 url로 인코딩되어 action url에 쿼리 스트링 파라미터로 전달 되고, post 메소드를 사용하면 form data는 HTTP request 의 body에 들어간다.

 

Reference

https://uiandwe.tistory.com/1133

 

get 방식의 글자 256자 제한은 잘못된 상식

사실 아는 사람들은 알겠지만 get방식의 글자수 제한이 256자 라는것은 거짓말이다. http 1 버전 시대에서 잘못 내려온 일종의 속설이다. (http 1이 96년도 발표이다. 현재 많은 브라우저가 http 2.0을

uiandwe.tistory.com

https://2jinishappy.tistory.com/314

 

GET Method는 URL을 256자 이하로 제한하지 않는다

HTTP Method를 정의하고, GET과 POST의 차이를 비교할 때 주로 등장하는 말인 'GET Method의 최대 길이(URI+Query String)는 최대 256자이다'라는 말은 사실이 아니다 하지만 많은 자료에서는 위와 같이 표기되

2jinishappy.tistory.com

 

http://daplus.net/web-services-http-get-%EC%9A%94%EC%B2%AD%EC%9D%98-%EC%B5%9C%EB%8C%80-%EA%B8%B8%EC%9D%B4/

 

[web-services] HTTP GET 요청의 최대 길이 - 리뷰나라

HTTP GET 요청 의 최대 길이는 얼마입니까? 서버가이 길이를 초과하는 GET 요청을 수신하면 리턴 할 수 있거나 응답해야하는 응답 오류가 있습니까? 이것은 브라우저 한계를 보는 것도 흥미롭지 만

daplus.net

https://noahlogs.tistory.com/35

 

[네트워크] get 과 post 의 차이

GET 과 POST 는 HTTP 메서드로 클라이언트에서 서버로 무언가를 요청할 때 사용한다. 2019/06/01 - [IT 정보 로그캣/CS] - [네트워크] http 란 [네트워크] http 란 기본적으로 네트워크 통신을 할 때 처음 접하

noahlogs.tistory.com

 

'백엔드 > 네트워크' 카테고리의 다른 글

HTTP 메소드 정리  (4) 2022.06.10
CORS (교차 출처 리소스 공유)  (1) 2022.06.07

HTTP 메소드란?

HTTP 메소드는 클라이언트가 웹서버에게 사용자 요청의 목적이나 종류를 알리는 수단이다.

최초의 HTTP 에서는 GET 메소드 하나밖에 없었지만 이후 다양한 메소드들이 생겨났다.

 

 

HTTP 메소드 종류

HTTP 메소드의 종류는 총 9가지가 있고, 주로 쓰이는 메소드로는 5가지가 있다.

 

주요 메소드

GET : 서버로부터 데이터 취득 (리소스 조회)

POST : 서버의 데이터를 추가, 작성

PUT : 서버의 데이터를 갱신(대체)하거나 작성

DELETE  : 리소스 삭제

PATCH : 리소스의 일부분 수정

 

기타 메소드

OPTIONS : 대상 리소스에 대한 통신 가능 옵션을 설명 (주로 CORS에서 사용)

HEAD : GET 과 동일하지만 메시지 부분을 제외하고 상태 줄과 헤더만 반환

CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정

TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

 

 

멱등성 : 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때 해당 HTTP 메서드가 멱등성을 가졌다고 한다. 멱등성 메서드에는 통계 기록을 제외하면 어떠한 부수 효과도 존재해서는 안되며, 올바르게 구현한 경우 GET, HEAD, PUT, DELETE 메서드는 멱등성을 가진다. POST 메서드는 그렇지 않다. 모든 안전한 메서드는 멱등성도 가진다.

 

 

제일 자주 사용하는 4가지 메소드만 추가 설명을 더 정리하겠다.

1. GET

 주로 데이터를 읽거나(Read) 검색(Retrieve)할 때 사용된다. Get 요청이 성공적으로 이루어진다면 json 혹은 xml과 함께 200 (Ok) 응답코드를 리턴한다. 오로지 데이터를 읽을 때만 사용하고 수정할 때는 사용하지 않는다. 데이터를 변경하는 연산에 사용하지 않으므로 당연히 멱등성을 가진다.

 

요청 시 Body 값과 Content-Type이 비워져있고 주로 쿼리스트링으로 파라미터를 주고받는다. Body를 사용해서 데이터를 전달할 수는 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.

 

조회 성공 시 Body 값에 데이터 값을 저장하여 성공 응답을 보낸다.

 

GET은 캐싱이 가능하여 같은 데이터를 한 번 더 조회할 경우에 저장한 값을 사용하여 조회 속도가 빨라진다.

 

2. POST

주로 새로운 리소스를 생성하거나 프로세스 처리에 사용된다. 성공적으로 creation을 완료하면 201 (Created) 응답 코드를 반환한다. 요청이 들어올 때마다 리소스가 새로 생성되기에 같은 POST 요청을 여러 번 보냈을 때 항상 같은 결과물이 나오는 것을 보장하지 않으므로 멱등성을 갖지 않는다. 

 

3. PUT

PUT는 리소스를 업데이트 / 생성할 때 사용된다. 즉, 리소스가 있으면 대체하고 없으면 생성한다. 동일한 PUT 요청을 여러 번 호출하면 항상 동일한 결과가 생성되기에 멱등성을 가진다. 

 

4. DELETE

지정된 리소스를 삭제할 때 사용한다. 동일한 요청을 여러 번 보내면 처음 보낸 요청에서 지정 리소스가 삭제되고 이후에는 이미 리소스가 삭제 되고 없어서 에러 코드를 반환할 것이므로 요청을 여러 번 보내도 서버의 상태는 동일하다. 따라서 DELETE 메소드는 멱등성을 가진다.

 

삭제를 위한 요청이므로 요청시에 Body 값과  Content-Type 값이 비워져있다. 

 

HTTP 메소드의 특징을 표로 정리하면 아래와 같다.

출처 : https://kyun2da.dev/CS/http-메소드와-상태코드/

안전 메소드는 계속해서 메소드를 호출해도 리소스를 아예 변경하지 않는다는 뜻이다. 

멱등 메소드는 위에서 설명한 바와 같다.

 

 

추가 정리

GET vs POST

https://fidget278.tistory.com/36

 

POST vs PUT

POST는 요청을 할 때마다 새로운 데이터가 생성되지만, PUT은 사용자가 데이터를 지정하고 수정하는 것이기에 같은 요청을 계속 하더라도 데이터가 계속 생성되지 않고 해당 리소스가 같은 값으로 계속 수정되는 것이므로 멱등성을 가진다.

 

PUT vs PATCH

위에서 PATCH는 리소스의 일부분만 수정하는 것이라고 했다. 반대로 PUT은 지정한 리소스를 완전히 교체해버린다(덮어쓴다). 따라서 PUT은 멱등하고, PATCH는 멱등하지 않다.

 

정확하게는, PATCH는 멱등하게 설계할 수도, 멱등이 아니게 설계할 수도 있다.

예를 들어 사용자 정보{이름, 나이} 가 있을 때 이름값만 바꾸게 설정한다면 요청할 때마다 이름이 같은 값으로 바뀌게 되므로 해당 PATCH 요청은 멱등하다.

하지만 한 번 호출할 때마다 나이를 1살씩 더 하는 식으로 설계했다면 요청을 할 때마다 나이가 1살씩 늘어나게 되니 해당 PATCH 요청은 멱등하지 않다. 

 

물론 PUT도 설계하기에 따라 멱등하지 않을 수도 있다. 하지만 위에서 멱등성을 설명할 때도 달아놨듯이 올바르게 구현할 경우 PUT은 멱등해야한다. 즉, PUT은 데이터를 가공하는 것이 아니라 해당 데이터를 덮어써서 바꾸는 것이 태초의 목적인 것이고 PATCH는 그렇지 않기에 올바르게 구현했을 때를 기준으로 PUT은 항상 멱등하고 PATCH는 항상 멱등하다고 말할 수 없다.

 

 

Reference

https://developer.mozilla.org/ko/docs/Glossary/Idempotent

 

멱등성 - 용어 사전 | MDN

동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말합니다. 다른 말로는, 멱등성 메

developer.mozilla.org

https://velog.io/@gidskql6671/HTTP-Method%EC%9D%98-%EB%A9%B1%EB%93%B1%EC%84%B1

 

HTTP Method의 멱등성

HTTP 메서드의 멱등성(Idempotent)에 대해 알아보자

velog.io

https://velog.io/@yh20studio/CS-Http-Method-%EB%9E%80-GET-POST-PUT-DELETE

 

Http Method 란? (GET, POST, PUT, DELETE)

평소에 코딩을 하면서 서버와 클라이언트가 소통을 하기 위해서 보통 Http를 이용을 하게 되었습니다. 그런데 GET, POST, PUT, DELETE 등 여러가지의 Http Method 가 존재하는데 명확하게 사용하고 있을까?

velog.io

https://kyun2da.dev/CS/http-%EB%A9%94%EC%86%8C%EB%93%9C%EC%99%80-%EC%83%81%ED%83%9C%EC%BD%94%EB%93%9C/

 

http 메소드와 상태코드

HTTP 메소드란 HTTP 메소드는 이다. 최초의 HTTP에서는 GET 메소드 하나밖에 없었지만 이후 다양한 메소드들이 생겨났다. HTTP 메소드 종류와 특징 HTTP 메소드의 종류는 총 9가지가 있다. 이 중 주로 쓰

kyun2da.dev

https://www.inflearn.com/questions/110644

 

Patch 메서드가 멱등이 아닌 이유 - 인프런 | 질문 & 답변

패치의 경우 멱등성을 갖지 않는 이유가 무엇인가요? 외부 요인에 의해 값이 변경되지 않는 이상 항상 같은 결과를 가져오는 것 아닌가요..? - 질문 & 답변 | 인프런...

www.inflearn.com

 

'백엔드 > 네트워크' 카테고리의 다른 글

GET 과 POST의 차이  (0) 2022.06.12
CORS (교차 출처 리소스 공유)  (1) 2022.06.07

cross-origin 이란?

출처(origin)이란 Protocol, Host, Port 를 합친 것을 말한다.

즉, cross-origin 이란 다음 중 한 가지라도 다른 경우를 말한다.

 

1. 프로토콜 

ex) http 와 https 는 프로토콜이 다름

2. 도메인 

3. 포트 번호

 

CORS 란?

브라우저에서 cross-origin 요청을 안전하게 할 수 있도록 하는 메커니즘이다.

 

브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한한다. 그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브라우저에서는 요청을 허락하고, 동의하지 않는다면 브라우저에서 거절한다.

 

이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header 를 이용해서 가능한데, 이를 CORS(Cross-Origin Resource Sharing) 라고 부릅니다. 

 

동일 출처 정책(Same-Origin Policy, SOP) 란?

브라우저를 거치지 않고 Postman으로 API를 테스트할 때는 잘 동작하다가 브라우저에서 API를 호출하면 CORS policy 오류가 발생할 때가 있다. 그 이유는 브라우저가 동일 출처 정책을 지켜서 다른 출처의 리소스 접근을 금지하기 때문이다. 동일 출처 정책을 지키면 외부 리소스를 가져오지 못해 불편하지만, XSSCSRF 등의 보안 취약점을 노린 공격을 방어할 수 있다. 하지만 현실적으로 외부 리소스를 참고하는 것이 꼭 필요하기 때문에 외부 리소스를 가져올 수 있는 방법이 존재해야 하고, 그를 위한 예외 조항이 CORS 이다. 

 

CORS 동작 원리

CORS 동작 방식은 단순 요청 방법(Simple Request)과 예비 요청(Preflight request)을 먼저 보내는 방법 2가지가 있다.

 

Simple Request - 단순 요청 방법

1. 서버로 요청한다.

2. 서버의 응답이 왔을 때 브라우저가 요청한 Origin과 서버가 응답한 헤더의 Access-Control-Request-Headers의 값을 비교하여 유요한 요청이라면 리소스를 응답한다. 만약 유효하지 않은 요청이라면 브라우저에서 이를 막고 에러가 발생한다.

 

Simple Request 조건

  • 요청 메서드(method)는 GET, HEAD, POST 중 하나여야 합니다.
  • Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width를 제외한 헤더를 사용하면 안 됩니다.
  • Content-Type 헤더는 application/x-www-form-urlencoded, multipart/form-data, text/plain 중 하나를 사용해야 합니다.

첫번째 조건은 어렵지 않지만 두번째, 세번째 조건은 까다로운 조건이다. 두번째 조건은 사용자 인증에 사용되는 Authorization 헤더도 포함되지 않아 까다로운 조건이며, 3번 조건은 많은 REST API들이 Content-Type으로 application/json을 사용하기 때문에 지켜지기 어려운 조건이다. 

 

Preflight request

1. Origin헤더에 현재 요청하는 origin을 담고, Access-Control-Request-Method 헤더에 요청하는 HTTP method를 담고 Access-Control-Request-Headers 요청 시 사용할 헤더를 OPTIONS 메서드로 서버로 요청한다. 이때 내용물은 없이 헤더만 전송한다.
2. 브라우저가 서버에서 응답한 헤더를 보고 유효한 요청인지 확인한다. 만약 유효하지 않은 요청이라면 요청은 중단되고 에러가 발생한다. 만약 유효한 요청이라면 원래 요청으로 보내려던 요청을 다시 요청하여 리소스를 응답 받는다.

 

GET, POST, PUT, DELETE 등의 메서드로 API를 요청했는데, 크롬 개발자 도구의 네트워크 탭에 OPTIONS 메서드로 요청이 보내졌다면 CORS를 경험한 것이다. Preflight 요청은 실제 리소스를 요청하기 전에 OPTIONS라는 메서드를 통해 실제 요청을 전송할지 판단 한다.

 

OPTIONS 메서드로 서버에 예비 요청을 먼저 보내고, 서버는 이 예비 요청에 대한 응답으로 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보낸다. 브라우저는 단순 요청과 동일하게 Access-Control-Allow-Origin 헤더를 확인해서 CORS 동작을 수행할지 판단한다.

 

요청 헤더 목록

  • Origin
  • Access-Control-Request-Method
    • preflight 요청을 할 때 실제 요청에서 어떤 메서드를 사용할 것인지 서버에게 알리기 위해 사용 된다.
  • Access-Control-Request-Headers
    • preflight요청을 할 때 실제 요청에서 어떤 header를 사용할 것인지 서버에게 알리기 위해 사용 된다.

 

응답 헤더 목록

  • Access-Control-Allow-Origin
    • 브라우저가 해당 origin이 자원에 접근할 수 있도록 허용합니다. 혹은 *은 credentials이 없는 요청에 한해서 모든 origin에서 접근이 가능하도록 허용 한다.
  • Access-Control-Expose-Headers
    • 브라우저가 액세스할 수 있는 서버 화이트리스트 헤더를 허용 한다.
  • Access-Control-Max-Age
    • 얼마나 오랫동안 preflight요청이 캐싱 될 수 있는지를 나타낸다.
  • Access-Control-Allow-Credentials
    • Credentials가 true 일 때 요청에 대한 응답이 노출될 수 있는지를 나타낸다.
    • preflight요청에 대한 응답의 일부로 사용되는 경우 실제 자격 증명을 사용하여 실제 요청을 수행할 수 있는지를 나타낸다.
    • 간단한 GET 요청은 preflight되지 않으므로 자격 증명이 있는 리소스를 요청하면 헤더가 리소스와 함께 반환되지 않으면 브라우저에서 응답을 무시하고 웹 콘텐츠로 반환하지 않는다.
  • Access-Control-Allow-Methods
    • preflight요청에 대한 대한 응답으로 허용되는 메서드들을 나타낸다.
  • Access-Control-Allow-Headers
    • preflight요청에 대한 대한 응답으로 실제 요청 시 사용할 수 있는 HTTP 헤더를 나타낸다.

 

출처

https://hannut91.github.io/blogs/infra/cors

 

CORS란 무엇인가? – Yunseok's Dev Blog

 

hannut91.github.io

https://beomy.github.io/tech/browser/cors/

 

[Browser] CORS란?

교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)에 대해 살펴보도록 하겠습니다.

beomy.github.io

 

'백엔드 > 네트워크' 카테고리의 다른 글

GET 과 POST의 차이  (0) 2022.06.12
HTTP 메소드 정리  (4) 2022.06.10

+ Recent posts