HTTP 메서드 GET vs POST
둘 다 HTTP 프로토콜을 이용해 서버에 데이터를 전달하는 방식이다.
GET
- 서버로부터 정보를 조회하기 위해 설계된 메소드
- 요청을 전송할 때 필요한 데이터를 HTTP Request Message의 Header 부분의 URL에 담아 전송
- URL의 끝에 ?와 함께 Key=Value 형태의 쌍을 이루는 요청 파라미터를 붙임
- 요청 정보가 여러 개일 경우 '&'로 구분
ex) www.urladdress.xyz?name1=value1&name2=value2
- 이를 쿼리스트링이라고 함
특징
- URL에 쿼리스트링을 붙이는 방식이기 때문에 길이 제한이 있어 대용량 데이터 전송이 어렵다.
- 한 번 요청 시 전송 데이터(주솟값 + 파라미터)의 양은 255자로 제한된다.(HTTP/1.1은 2048자)
- 요청 데이터가 URL에 그대로 노출되므로 보안상 취약하다. (ex.password)
- GET 요청과 그에 대한 응답이 브라우저에 의해 캐쉬된다. -> POST 보다 빠름
- js, css 같은 정적 컨텐츠는 데이터가 크고, 변경될 일이 적어 동일한 요청을 여러 번 보낼 필요가 없음
- 정적 컨텐츠를 요청하면 브라우저에서는 요청을 캐시해두고, 동일한 요청이 발생하면 서버로 요청을 보내지 않고 캐시된 데이터를 사용함
- ex. 프론트 개발 시 정적 컨텐츠를 변경해도 캐시된 데이터 때문에 내용이 바뀌지 않았던 경우가 있음
POST
- 서버의 값이나 상태를 바꾸기 위해 설계된 메소드
- 전송해야될 데이터를 HTTP Request Message의 Body 부분에 담아서 전송
- Request Header의 Content-Type에 해당 데이터의 타입을 표현 (ex. application/json)
- 타입을 명시하지 않으면 서버는 자기 혼자 타입을 유추함
특징
- Request Body는 길이의 제한없이 데이터를 전송할 수 있어서 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다.
- 요청 정보를 Request Body 안에 담아 전송하기 때문에 GET 방식보다 보안상 안전하다.
- POST도 크롬 개발자 도구 등을 사용하면 확인 할 수 있기 때문에 민감한 데이터는 암호화해야 함
조회하기 위한 용도 POST가 아닌 GET 방식을 사용하는 이유?
- GET 방식은 서버에게 여러 번 요청을 하더라도 동일한 응답이 돌아와야 한다. (Idempotent)
- POST 방식은 서버에 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있다.(Non-idempotent)
- GET 방식은 가져오는 것(Select) 으로, 서버의 데이터나 상태를 변경시키지 않아야 한다.
- Ex) 게시판의 리스트, 게시글 보기 기능
- 예외) 방문자의 로그 남기기, 글을 읽은 횟수 증가 기능
- POST 방식은 수행하는 것 으로, 서버의 값이나 상태를 바꾸기 위한 용도이다.
- Ex) 게시판에 글쓰기 기능
- 이처럼 큰 차이가 있기 때문에 설계원칙에 따라 적절한 용도로 사용해야한다!