API 명세서를 작성할 때 항상 고민했었다...
client 입장에서 데이터를 가져올 때는 GET, DB 또는 Server 내의 어떤 데이터를 수정할 때는 POST, 이렇게 당연하다는 듯이 사용해 왔다. 하지만 POST의 요청도 GET과 같이 데이터를 받을 수 있고 GET 요청을 받는다고 해서 DB의 내용을 수정할 수 없는 것도 아니다. 당연하다는 듯이 써온 이 Http method들의 차이를 분명히 알아둘 필요가 있어 찾아보았다.
둘을 간단히 예기하면
GET은 가져온다는 것이고, POST는 수행한다는 것.
이 부분은 누구나 알고 있으니 각각 보자면,,,
GET
GET은 client에서 server로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 메서드
주로 Read, Retrieve의 역할을 하며 GET으로 요청을 보낼 때는 주고 끝단 '?' 뒤에 파라미터를 포함해 전송되며, 이 부분을 쿼리 스트링이라고 부른다.
ex) www.jangbageum.tistory.com/data?food1=김밥&food2=라면
위와 같이 GET은 '?'뒤에 쿼리 스트링 파라미터들을 포함해 값을 전달하고 받는다.
데이터를 오로지 읽을 때만 사용하고 수정할 때는 사용하지 않는다는 GET의 특징은 데이터 변형의 위험에서 안전하다고 할 수 있다.
이 외에도 GET 요청은 브라우저에서 캐싱이 가능하다는 것이다.
GET 요청의 특징
- 요청과 반환에 있어 자원 낭비를 줄이기 위해 캐싱을 함
- 요청을 북마크에 추가 가능
- 데이터에 대한 제한이 있음
- 성공 시 200 상태 코드를 반환
- idempotent
POST
POST는 리소스를 생성/업데이트하기 위해 서버에 데이터는 보내는 데 사용되는 메서드
GET과 다르게 http메시지를 쿼리 스트링이 아닌 Body에 담아 전송한다.
그리고 Body 데이터의 타입은 전송 시 header의 Content-Type에 명시를 해 결정한다.
또한 데이터의 길이에 제한이 없어 대용량 데이터의 전송이 가능하며 HTTP body에 데이터가 들어가 쿼리 스트링 방식보다는 보안 면에서 안전하다고는 하나 이는 데이터가 암호화되지 않는 이상 비슷하다고 할 수 있다.
POST 요청의 특징
- 브라우저에 캐싱이 되지 않음
- 북마크에 추가 불가
- 전송 데이터의 길이 제한이 없음
- 자원을 성공적으로 생성 시 201(Created) 상태 코드를 반환
- Non - idempotent
idempotent와 non-idempotent
idempotent란 우리말로 멱등이며 뜻은
수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질
을 말한다.
즉, 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야 된다는 말이다.
GET은 indempotent하다는 것은 서버에게 동일한 요청을 여러 번 전송하더라고 동일한 응답이 돌아와야 한다는 것을 의미한다. 이는 데이터의 상태를 변형하지 않고 오로지 조회 할 때만 사용해야한다는 설계 원칙이 있는것이다.
이와 반대로 POST는 non-indempotent로 서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있다는 것이다.
막 사용해도 될 것 같지만 서로 큰 차이가 있고 이처럼 설계원칙에 따라 적절한 용도로 사용해야 될 것 같다.
GET과 POST 한 눈에 보기
HTTP Method | GET 방식 | POST 방식 |
URL 예시 | http://localhost/data?req=1&req2 | http://localhost/data |
데이터가 담기는 곳 | HTTP 패킷 Header | HTTP 패킷 Body |
리소스 전달 방식 | 쿼리스트링 | HTTP Body |
HTTP 응답 코드 | 200 | 201 |
URL에 데이터 노출 여부 | O | X |
캐싱 가능 여부 | O | X |
브라우저 기록 | O | X |
북마크 추가 | O | X |
데이터 길이 제한 | O | X |
멱등성(idempotent) | O | X |
'ETC > Frontend' 카테고리의 다른 글
[JavaScript] 이벤트 리스너 (Event Listener) 사용법 ( + 이벤트 종류) (0) | 2022.02.08 |
---|---|
[JavaScript] Event Handler (이벤트 핸들러)와 Event Listener (이벤트 리스너)의 차이 (0) | 2022.01.26 |
[JavaScript] Document 객체 (0) | 2022.01.26 |
[JavaScript] DOM : Document Object Model (문서 객체 모델) (0) | 2022.01.26 |