Method는 클라이언트가 서버측에 특정한 동작을 요청하는데 쓰이는 것으로, 서버마다 구현되어있는 method는 각각 다를 수 있지만, 개발자는 최대한 method의 목적에 맞는 기능을 구현해야 한다.
A. 안전한 method
HTTP에는 안전한 method의 집합이 있다. 안전한 method란 다음과 같은 method를 의미한다.
HTTP 요청으로 인해 서버 혹은 DB에 아무런 작용이 일어나지 않는 method.
작용이란 DB에 새로운 값이 입력, 수정, 삭제되거나 신용카드로 대금이 청구되는 등의 동작을 이야기 한다.
안전한 method에는 GET, HEAD등이 있다.
B. Method의 종류
method
기능
GET
단순한 자원의 요청.
HEAD
GET과 비슷하지만, header만 반환.
PUT
요청한 URL과 본문으로 서버는 새로운 문서를 만들거나, 기존 URL에 해당하는 문서를 변경.
POST
서버에 데이터를 보내기위해 사용.
OPTIONS
서버가 지원하는 method를 반환.
DELETE
자원을 삭제
TRACE
주로 진단시에 사용. 클라이언트에게 자신의 요청이 서버에 도달했을 때 어떻게 보이기 되는지 알려줌.
PATCH
PUT과 유사하나, 문서 전체를 바꾸지 않고 일부만 바꿀때 사용.
HEAD method를 사용하게 되면, 리소스를 직접 가져오지 않고 리소스의 존재 여부, 타입 등을 알아낼 수 있다. HTTP/1.1 스펙을 준수하기 위해서는 HEAD가 반드시 구현되어 있어야 하고, HEAD를 통해 반환되는 header와 GET을 통해 반환되는 header는 반드시 일치해야 한다.
PUT과 POST method가 하는 일은 조금 다른데, 실제로 api서버를 개발할 때 POST는 새로 생성 PUT은 변경 혹은 수정에 사용했었던 기억이 있다.
PATCH라는 method는 책에 소개되어있지는 않지만 예전에 api서버를 개발할 때의 기억이 있어 추가해 보았다. PATCH는 PUT과 비슷한 역할을 하지만, PUT은 문서 전체를 변경하는 대신 PATCH는 일부분만 변경하기 때문에 update기능을 구현하는데에 의미적으로 조금 더 적합하지 않나 하는 생각이 든다.
5. Status code, Reason phase
Status code와 reason phase는 response message에 포함되어 반환되는 값으로, 클라이언트의 요청에 대해 서버가 처리한 결과이다. Status code는 보통 세자리의 숫자기 때문에 코드상에서 에러 처리등의 용도로 사용한다. Reason phase는 status에 대해서 사람이 좀 더 알아보기 쉬운 짧은 readable text 형태이기 때문에 status code를 좀 더 쉽게 이해하도록 도와준다.
새로운 리소스로 연결되는 것이 아닌, 확인 페이지 또는 업로드 진행 페이지등과 같은 곳으로 연결됨. 일반적으로 PUT, POST 요청에 대한 응답으로 클라이언트에게 리소스의 위치를 알려줌.
304
Not Modified
주로 캐시를 목적으로 사용됨. If-None-Match 또는 If-Modified-Since 같은 조건부 헤더를 사용하였을때, 최근에 문서가 수정된 적이 없을 경우 이 code가 반환되며 클라이언트는 계속해서 기존에 캐시된 버전을 사용할 수 있음. 해당 code의 응답 메시지는 엔터티 본문을 가져서는 안됨.
305
Use Proxy
리소스가 반드시 proxy를 통해 접근되어야 함. Proxy의 위치는 Location 헤더를 통해 주어짐. 현재 proxy의 in-band 설정에 대한 보안상의 걱정으로 인하여 권장하지 않음.
306
현재 사용되지 않음
307
Temporary Redirect
301과 동일함. 원래 요청의 메서드와 본문은 리디렉션 된 요청을 수행하기 위해 다시 사용됨. 302를 사용할 경우, 예전의 클라이언트들은 GET 방식을 잘못 변경했지만 307은 method와 엔터티 본문이 변하지 않는 것을 보장함.
C. 400번대 status code
400번대의 status code는 클라이언트의 에러를 나타내며, 404와 같은 몇몇 에러를 제외하면 브라우저에 의해 처리된다. 400번대의 status code는 종류가 많기때문에, 주로 사용되는 것에 대해서만 설명하고자 한다. 나머지 status code에 대해서는 이곳 (opens new window)을 참고하면 좋을 것 같다.
코드
Reason phase
의미
400
Bad Request
클라이언트의 요청을 서버가 이해할 수 없음.
401
Unauthorized
클라이언트가 스스로를 인증해야 함.
403
Forbidden
클라이언트의 접근 권한이 없음. 401과 다른점은 서버가 클라이언트가 누구인지 알고있음.
404
Not Found
요청한 URL을 찾을 수 없음.
405
Method Not Allowed
현재 요청한 method를 사용할 수 없음. GET과 HEAD는 제거될 수 없으며 따라서 이 code를 반환할 수 없음.
408
Request Timeout
클라이언트의 요청을 완수하기에 시간이 오래 걸리는 경우.
D. 500번대 status code
500번대의 status code는 서버의 에러를 나타낸다.
코드
Reason phase
의미
500
Internal Server Error
서버가 요청을 처리할 수 없게 만드는 에러에 봉착함.
502
Bad Gateway
Proxy나 gateway 역할을 하는 서버가 요청을 처리하는 데 필요한 응답을 얻기 위해 작업하는 동안 잘못된 응답을 수신했음 (상위 gateway 접속 불가 등).
503
Service Unavailable
서버가 요청을 처리할 준비가 되지 않음. 유지보수 혹은 과부하가 원인. 서버는 응답 메시지에 Retry-After헤더를 사용하는 것이 좋다.
504
Gateway Timeout
408과 비슷하지만, 다른 서버에 요청을 보내고 응답을 기다리다 timeout이 발생한 상황.
505
HTTP Version Not Supported
서버가 지원할 수 없거나 지원하지 않는 버전의 프로토콜로 된 요청을 받음.
6. Conclusion
HTTP 완벽 가이드 (opens new window)의 3장을 가볍게 정리해 보았다. 저번과 마찬가지로 대충 알고 있던 부분을 채울수 있어서 좋았고, 몰랐던 부분을 알수 있게되어 더 느낌이 좋았다. 다만 이번의 글은 “공부했다!”라는 느낌 보다는 단순한 정보의 나열처럼 보이는 것이 조금은 아쉽다.
특히 header부분을 공부하고 나서보니 개발자 도구의 network탭이 새롭게 보이는 효과를 보았다. 생각보다 header가 큰 역할을 하고 있으며, 적절히 사용하면 앞으로의 프로젝트에도 도움이 될 것이라 생각한다.