API를 만들다 보면 GET 메서드와 POST 메서드 중에서
어떤 상황에서 어떤 것을 사용해야 하는지 헷갈립니다.
정확하게 알아보고 가겠습니다.
HTTP 메서드의 종류
HTTP 메서드 종류라고 검색만 하면
쉽게 자료를 얻을 수 있습니다.
하지만 저는 사례 위주로 사용법을 익혀보려고 합니다.
주요 메서드
1.GET
2.POST
3.PUT
4.PATCH
5.DELETE
기타 메서드
6.HEAD
7.OPTIONS
8.CONNECT
9.TRACE
GET
GET은 웹 서버로부터 데이터를 요청할 때 사용합니다.
서버에 변화를 일으키지 않고 단순 읽기 작업에 적합합니다.
1. 요청 방식
게시판에서 게시글을 조회할 때 GET 요청을 사용했습니다.
EX) http://localhost:8080/board/post?category=humor&page=2
이런식으로 URL 경로에 값을 넣어서 전달할 수 있습니다.
경로의 마지막에 ?를 넣은 뒤 key=value의 형식으로 값을 추가합니다.
복수의 파라미터의 겨우에 &로 구분합니다.
스프링에서는 @RequestParam(value = "category") String category
이런식으로 URL의 값을 추출해서 사용할 수 있습니다.
2. 브라우저 캐싱
GET 요청이 반복되면 브라우저 캐싱을 이용해 이전 응답을 재사용 합니다.
하지만 주로 정적 리소스에 적용됩니다.
게시물 데이터 같은 경우는 계속해서 새로 가져오지만
기본 페이지 양식 같은 CSS, 이미지 파일, 자바스크립트 같은 프론트 양식은 재사용합니다.
하지만 이는 캐싱 정책을 설정해야 하므로 사용하려면 딥하게 들어가야 할 듯 합니다.
3. 북마크 가능
POST 요청 같은 경우는 요청 Body에 값을 넣어서 전달해야 합니다.
하지만 GET 요청은 URL만으로 모든 요청 정보가 전달이 가능하기 때문에
주소값 자체를 저장해두고 사용할 수 있습니다.
4. 멱등성과 보안
주로 읽기 위주의 요청을 합니다. 따라서 요청 경로에 민감한 데이터를 유출시키지 않는다면,
예를 들어 http://localhost:8080/login?password=1234
이런식으로 민감한 파라미터 값을 담지 않는다면 요청 자체가 서버 구조에
문제를 일으키지 않습니다.
따라서 같은 요청에 대해서 같은 결과만을 받을 수 있습니다.
POST
POST는 서버에 리소스를 생성하거나 업데이트 할 때 사용합니다.
key-value 구조의 요청 데이터를 Body에 담아서 전송합니다.
1. 요청 방식
게시판에 새로운 글을 등록할 때 POST 요청을 쓸 수 있습니다.
주로 JSON 형식으로 전달하고 XML, Text형식으로도 전달 가능합니다.
EX)
2. 브라우저 캐싱 x
기본적으로 브라우저 캐싱이 되지 않습니다.
3. 멱등성과 보안
POST 요청은 GET 요청과 달리 멱등성이 보장되지 않습니다.
서버에 저장된 데이터를 변경하거나 동일한 여러 개의 데이터가 저장될 수 있습니다.
하지만 URL에 데이터가 노출되지 않기 때문에 보안 측면에서 더 우수합니다.
PUT, PATCH
이 두 개의 메서드는 모두 서버의 리소스를 수정하거나 업데이트 할 때 사용합니다.
하지만 조금 차이점이 있기에 비교하면서 설명하겠습니다.
PUT은 리소스를 완전 대체, PATCH는 부분 수정
EX) 본인이 작성한 게시글을 수정하려고 합니다.
만약 게시글의 데이터 구조가 다음과 같다면
public class Post {
private String title;
private String content;
private String category;
}
PUT 요청에서는 Body에 title,content, category를 모두 담아서 보냅니다.
PATCH 요청에서는 일부만 선택하여 수정된 값을 보냅니다.
상황에 맞춰서 사용하시면 될 것 같습니다.
DELETE
서버 리소스를 삭제할 때 사용합니다.
1. 요청 방식
주로 URL에 삭제하고자 하는 리소스의 식별자를 넣어서 전달합니다.
게시물을 삭제하고 한다면
EX) http://localhost:8080/board/post/1
이런식으로 ID값만 전달해주면 됩니다.
2. 멱등성과 보안
리소스가 삭제되므로 권한 인증을 철저하게 해야합니다.
또한 같은 대상을 여러 번 삭제해도 성공 응답을 반환하는 데 문제가 없으므로
멱등성을 충족합니다.
*사용 빈도가 낮은 메서드 요청입니다.
슬쩍 보고 넘어가시면 되겠습니다.
HEAD
GET 요청과 일치하지만 헤더 정보만을 받아온다는 차이가 있습니다.
GET 요청을 보냈지만 반환 리소스를 확인할 필요가 없고
리소스의 변경 여부나 상태 정도만을 확인하고 싶다면
Body를 반환하지 않는 HEAD 메서드를 사용합니다.
OPTIONS
CORS(Cross-Origin Resource Sharing) 정책에 부합하는 메서드를 확인하기 위해
프리플라이트(pre-flight) 요청인 OPTIONS 요청을 먼저 보냅니다.
서버로부터 요청이 허용된다면 기존에 보내려 했던 요청을 보내게 됩니다.
EX) 요즘엔 백엔드 서버와 프론트 엔드 서버를 서로 다른 네트워크에서 구동시키는 경우가 많습니다.
개발을 하다보면 반드시 CORS 에러와 마주칩니다.
네트워크 연결에 오류가 있거나 CORS 정책을 설정하지 않았을 경우
브라우저가 이를 확인하기 위해 OPTIONS를 자동으로 요청합니다.
CONNECT
클라이언트가 프록시 서버와 보안 연결을 맺기 위해 사용합니다.
다른 HTTP 요청들과 달리 TLS(SSL) 터널을 생성하기 위해 사용됩니다.
EX) https://homepage.com에 접속을 하려고 한다칩시다.
참고로 HTTPS란 TLS/SSL 인증서로 암호화 되어있는 웹사이트입니다.
이러한 사이트에게 200 OK 응답을 받는다면 터널을 형성하여 데이터를 안전하게 주고받을 수 있습니다.
TRACE
요청이 메세지가 서버에 도달하는지 확인하기 위한 디버깅·보안 점검용 메서드.
보안 상의 이유로 대부분의 웹 서버에서 막혀있습니다.
웹서버는 클라이언트가 보낸 TRACE 요청에 대해
요청 메세지를 Body에 담아 그대로 반환합니다.
'[spring]스프링' 카테고리의 다른 글
[Spring] Jwt 토큰이란? (0) | 2023.08.08 |
---|---|
[Spring 게시판] 12. 게시물 페이징 API (0) | 2023.08.05 |
[Spring 게시판] 11. 게시물 수정·삭제 API (0) | 2023.08.02 |
[Spring 게시판] 10. 게시물 등록·조회 API + 포스트맨 사용법 (0) | 2023.08.01 |
[Spring 게시판] 9. JPA 환경에서 스프링 실행 + DataSource 연결 에러 (0) | 2023.08.01 |