뉴히의 개발 로그
[TIL]20230830 - GET, POST 개념과 방식의 차이점, 데이터 흐름 본문
GET 방식의 개념
GET은 요청하는 데이터가 HTTP URL의 일부로 포함되어 전송됩니다. 일반적으로 조회 작업에 사용됩니다.
GET 요청
- GET은 불필요한 요청을 제한하기 위해 요청이 캐시 될 수 있습니다.
- 파라미터에 내용이 노출되기 때문에 민감한 데이터를 다룰 때 GET 요청을 사용해서는 안 됩니다.
- GET 요청은 브라우저 기록에 남습니다.
- GET 요청을 북마크에 추가할 수 있습니다.
- GET 요청에는 데이터 길이에 대한 제한이 있습니다.
- Get 요청은 성공 시, 200(Ok) HTTP 응답 코드를 XML, JSON뿐만 아니라 여러 데이터(html, txt 등..), 여러 형식의 데이터와 함께 반환합니다.
- GET을 통해 서버에 리소스를 요청할 때 웹 캐시가 요청을 가로채 서버로부터 리소스를 다시 다운로드하는 대신 리소스의 복사본을 반환합니다. HTTP 헤더에서 cache-control 헤더를 통해 캐시 옵션을 지정할 수 있습니다.
- GET 요청은 idempotent(멱등) 합니다.
GET 데이터 흐름
- 사용자가 브라우저에서 URL을 입력하거나 링크를 클릭합니다.
- 브라우저가 해당 URL에 포함된 파라미터와 함께 서버에 요청을 보냅니다.
- 서버가 요청을 처리하고 필요한 정보를 응답으로 보냅니다.
- 브라우저가 응답을 받아 사용자에게 표시합니다.
Post 방식의 개념
POST는 요청 데이터를 HTTP 메시지 본문에 담아 전송하며, 서버의 상태를 변경하거나 데이터를 추가하는 작업에 사용됩니다.
Post 요청
- POST 요청은 캐시 되지 않습니다.
- POST 요청은 브라우저 기록에 남아 있지 않습니다.
- POST 요청을 북마크에 추가할 수 없습니다.
- POST 요청에는 데이터 길이에 대한 제한이 없습니다.
- Post 요청 중 자원 생성은 201(Created) HTTP 응답 코드를 반환합니다.
- Post 요청은 idempotent(멱등)하지 않습니다.
Post 데이터 흐름
- 사용자가 웹 폼에 데이터를 입력하고 제출 버튼을 클릭합니다.
- 브라우저가 데이터를 HTTP 본문에 담아 서버에 요청을 전송합니다.
- 서버가 요청을 처리하고, 결과를 확인하거나 필요한 정보를 응답으로 보냅니다.
- 브라우저가 응답을 받아 사용자에게 표시하거나 다른 동작을 수행합니다.
멱등성|멱등법칙 (idempotent)이란?
idempotent는 멱등법칙(冪等法則) 또는 멱등성(冪等性)이란 뜻으로, 수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.
출처 : 위키백과
즉, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질!!
차이점
GET / POST 는 브라우저가 서버에 요청 하는 것!
GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송.
URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 쿼리스트링이라고 부른다.
만약, 요청 파라미터가 여러 개이면 &로 연결.
POST는 리소스를 생성/변경하기 위해 설계되었기 때문에 GET과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송.
HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있다. 그래서 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다. 이처럼 POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 GET보다 보안적인 면에서 안전하다고 생각할 수 있지만, POST 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 한다.
그리고 POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 한다.
Content-Type의 종류로는 application/x-www-form-urlencoded, text/plain, multipart/form-data 등이 있다.
데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추. 만약, 알 수 없는 경우에는 application/octet-stream로 요청을 처리
GET vs POST
캐시 | ⭕️ | ❌ |
브라우저 기록 | ⭕️ | ❌ |
북마크 추가 | ⭕️ | ❌ |
데이터 길이 제한 | ⭕️ | ❌ |
HTTP 응답 코드 | 200(Ok) | 201(Created) |
언제 주로 사용하는가? | 리소스 요청 | 리소스 생성 |
리소스 전달 방식 | 쿼리스트링 | HTTP Body |
idempotent | ⭕️ | ❌ |