728x90
팀 프로젝트 진행 중, 똑같이 GET 메소드에 Body를 사용하는 상황에서 백엔드 api 테스트는 통과됐지만 프론트엔드 테스트 시 에러가 발생하는 상황이 생겼다.
일단 GET 메소드 대신 POST 메소드로 변경하였고, 다시 테스트해보니 이번에는 프론트엔드 테스트도 성공하였다.
같은 조건인데 백엔드 테스트는 성공하고, 프론트엔드 테스트는 실패하는 이유가 뭔지 궁금하여 찾아보았다.
GET은 Body를 쓰면 안 되는걸까?
HTTP GET 요청은 서버에 리소스를 검색하기 위해 설계되었다.
- GET 메소드라도 Body를 아예 받지 못하는 것은 아니다.
- 서버로 데이터를 보내기 위해 사용하지 않는다.
- GET 메소드는 URL에 query parameters를 포함할 수 있지만, message body를 포함하는 것은 권장되지 않는다.
HTTP 명세서에 GET 메소드가 message body를 사용하지 않는 것을 권장하는 이유
- 캐시 가능성
- HTTP GET 요청은 종종 웹 브라우저에 의해 캐시된다.
- GET 요청을 간단하고 예측 가능하게 유지함으로써, 이러한 시스템이 캐시를 보다 쉽게 관리하고 검색할 수 있다.
- 안전성
- GET 요청은 "안전(safe)" 및 "멱등(idempotent)"이어야 한다.
- 이는 서버에서 어떠한 데이터도 수정하지 않고 부작용이 없어야 함을 의미한다.
- GET 요청에서 message body를 허용하지 않음으로써, GET 요청이 안전하고 멱등하게 유지되도록 보장한다.
- 보안성
- GET 요청은 종종 서버 로그, 브라우저 히스토리 및 다른 시스템에서 기록된다.
- 데이터를 URL에 유지함으로써 이를 쉽게 볼 수 있으며, 제 3자가 잠재적으로 가로챌 수 있다.
- 반면 message body에 데이터를 포함하는 POST 요청은 덜 가시적이며 추가적인 보안 계층을 제공할 수 있다.
그렇다면 왜 프론트엔드 테스트에서만 문제가 생겼을까?
찾아보니 GET에 Body를 넣는 것을 금지하는 것이 기존에 일반적으로 사용되어왔기 때문에, GET 요청에 Body가 있을 경우 거절당할 수도 있다고 한다. GET 메소드 요청 시 Body가 허용되기 시작한 시점은 2014년도부터라고 한다.
스펙 상 가능해야 하는 것이 맞지만, 우리가 Java 21이 나왔다고 모두가 Java 21을 사용하지 않는 것처럼 여전히 GET에 Body가 들어있을 경우 이를 지원하지 않는 경우가 있는 것이다.
[HTTP] 왜 GET은 body를 안쓸까?
HTTP란? HTTP(Hypertext Transfer Protocol)는 클라이언트와 서버 간의 통신을 가능하게 하도록 설계되었습니다. HTTP는 클라이언트와 서버 간의 request-response 프로토콜로 작동합니다. > 1. 클라이언트(브라우
velog.io
[HTTP] GET vs POST, GET은 body 값을 가지면 안 될까?
🌱 들어가기 전 스터디를 진행하면서, GET 요청과 POST 요청의 차이가 단순히 '의미론적'으로만 차이가 있는 건지 궁금해서 찾아보게 되었다. 습관적으로 나는 리소스 등록 시 POST를, 그리고 조회
cl8d.tistory.com
'Spring > Spring Study' 카테고리의 다른 글
[SSE] SSE란? (0) | 2024.07.15 |
---|---|
[Spring] UUID, PK로 사용하면 어떨까? (0) | 2024.07.13 |
[Spring] fromEntity, toEntity, ofEntity? - DTO와 Entity 변환 (0) | 2024.07.04 |
[Spring] 연관 매핑을 지양하라? (0) | 2024.07.04 |
[Spring] @Data는 왜 지양해야 하는 것일까? (0) | 2024.07.04 |