그저 주소창에 존재하는줄로만 알았던 HTTP가 이 인터넷 사이트, 정보를 구현하기 위해서 이렇게 많은 일을 하는지 몰랐다. HTTP 속에는 그걸 수행하기위한 많은 메소드와 코드가 있었고 실제 MVC 패턴을 배우는 와중에도 이렇게 손이 많이 가는구나라는걸 깨달아가는 중이다. 이번에는 저번 포스팅에 이어서 HTTP 안의 메소드와 응답코드에 대해서 포스팅하려고 한다.
HTTP Method는 서버에서 주어진 리소스에 수행하길 원하는 행동을 나타낸다. 메소드의 종류는 다양하지만 공공API, 네이버API를 비롯한 일반 웹의 요청 대부분에서 POST와 GET을 사용한다.
1. GET
(1) 원하는 정보를 서버에 요청할 때 쓰이며 리소스를 검색하고, 반환받기 위해 사용되는 메소드이다.
(2) 주소 창에 파라미터가 노출된다.
(3) 브라우저에서 주소에 대한 캐시가 이루어지므로 다음 번에 똑같은 요청을 할 때 캐시된 값(첫 요청의 응답에 함께 온 HTTP 헤더 정보를 참고)을 빠르게 가져올 수 있다.(Conditional GET)
2. POST
(1) 메시지 바디를 통해 서버로 요청 데이터를 전달하고 주로 새로운 리소스를 생성(create)할 때 사용된다.
(2) 주소 창에 파라미터가 노출되지 않기때문에 GET에 비해 상대적으로 보안성이 좋다.
(3) 브라우저가 주소 캐시를 하지 못하는 특성이 있다.
3. PUT
(1) POST와 같이 정보를 서버로 제출하는 것으로 형식은 동일하지만 갱신 위주이다.
(2) 데이터를 수정하는 것이기 때문에 요청 시에 Body 값과 Content-Type 값을 작성해야한다.
(3) 만약 메시지의 값이 이미 존재한다면 기존 리소스를 삭제하고 덮어쓰기 한다.
(4) PUT는 클라이언트측이 서버측 구현에 관여하는 것이므로 POST를 더 많이 사용한다.
4. DELETE
(1) 서버가 갖고 있는 리소스를 삭제하라는 의미로 사용한다.
(2) 데이터를 삭제하는 것이기 때문에 요청시에 Body 값과 Content-Type 값이 비워져있고 URI를 통해서 어떤 데이터를 삭제할 지 파라미터를 받는다.
5. PATCH
(1) 자원을 수정하라는 의미에서 PUT과 같지만 PUT은 자원 전체를 수정하는 반면 PATCH는 해당 자원의 일부 부분을 수정한다.
6. OPTIONS
(1) 해당 메소드를 통해 Target Server에서 지원되는 메소드를 확인할 수 있다.
7. HEAD
(1) GET과 유사한 방식이나 웹 서버에서 헤더 정보 이외에는 어떤 데이터도 보내지 않는다.
(2) 실제 문서를 요청하는 것이 아니라 문서 정보를 요청한다.
8. TRACE
(1) 요청 리소스가 어떤 경로를 거치는지 보여주는 메소드로 테스트 시에 사용한다.
(2) Request Packet이 방화벽, Proxy Server, Gateway등을 거치면서 변조될 수 있는데 Server에 도달 했을 때의 최종 Request Packet을 볼 수 있다.
(3) 응답 Body를 통해 Original Data와 서버에 도달했을 때의 비교본 Data를 확인할 수 있다.
9. CONNECT
(1) CONNECT 메서드는 프록시 서버를 통해 HTTP 터널을 만드는 데 사용된다.
(2) 프록시 서버는 클라이언트를 대신하여 원하는 서버와의 연결을 설정하고, 연결이 설정된 후에도 프록시 서버는 클라이언트와 TCP 스트림을 계속 프록시한다.
(3) 이때 Proxy는 data relay의 역할만 수행하고 key를 모르기 때문에 data를
검사할 수 없으며 end-to-end 보안이 보장된다.
멱등성은 간단하게 말해서 동일한 요청을 여러 번 보내어 수행해도 결과가 같음을 의미한다. 위에서 설명한 메소드 중 GET, HEAD, PUT, DELETE, OPTIONS, TRACE이 멱등성을 보장한다.
그 외의 POST, PATCH, CONNECT는 보장하지 않는데 그중 많이 사용되는 POST가 멱등성을 보장하지 않는 이유는 새로운 레코드의 등록을 의미하기 때문이다. 그래서 타임아웃 등의 이유로 재시도하는 경우 여러 레코드가 등록될 수도 있다.
인터넷을 이용하는 사람이라면 누구라도 403 Forbidden, 404 NOT FOUND 같은 오류 페이지를 본 적이 있을 것이다. 이것을 응답 코드라고하며 사실 저런 보편적인 오류를 제외하고는 대부분 본 적이 없는 코드들일것이다. 사실상 제일 많이 쓰이는 것은 200, 4XX, 5XX 코드이고 또 외울 필요는 없기 때문에 단순한 부연설명을 붙여서 기술하는 것으로 마무리 한다.
1XX : Information responses - 서버에 연결된 클라이언트는 작업을 계속 진행하라는 의미이다.
100 Continue
101 Switching Protocol - 서버에서 프로토콜을 변경할 것임을 알려준다.
102 Processing(WebDAV) - 서버가 요청을 수신하고 처리중이지만 아직 제대로된 응답을 주지 못한 경우이다.
2XX : Successful responses - 서버와의 요청이 성공했을시에 받을 수 있는 코드이다.
200 OK
201 Created
202 Accepted - 서버 요청을 접수했지만 아직 처리하지 못 했을 경우이다.
203 Non-Authoritative Information - 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공할 경우이다.
204 No Content
205 Reset Content
206 Partial Content - 서버가 GET 요청의 일부만 처리했을 경우이다.
207 Multi-Status
208 Already Reported
226 IM Used ( HTTP Delta encoding )
3XX : Redirection message - request를 마치기 전 추가 동작을 해야 할 경우이다.
300 Multiple Choice
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
306 Unused
307 Temporary Redirect
308 Permanent Redirect
4XX : Client error responses - 클라이언트의 request에 에러가 있음을 알려주는 status code이다.
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Payload Too Large
414 URI Too Long
415 Unsupported Media Type
416 Requested Range Not Satisfiable
417 Expectation Failed
418 I'm a teapot
421 Misdirected Request
422 Unprocessable Entity (WebDAV)
423 Locked (WebDAV)
424 Failed Dependency (WebDAV)
426 Upgrade Required
428 Precondition Required
429 Too Many Requests
431 Request Header Fields Too Large
451 Unavailable For Legal Reasons
5XX : Server errors - 서버 오류로 인해 requet를 수행할 수 없음을 알려주는 status code이다.
500 Internal Server Error
501 Not Implemented - 서버가 요청을 이행하는 데 필요한 기능을 지원하지 않음을 나타낸다.
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout505 HTTP Version Not Supported
506 Variant Also Negotiates
507 Insufficient Storage
508 Loop Detected (WebDAV)
510 Not Extended
511 Network Authentication Required
http://www.ktword.co.kr/test/view/view.php?no=3791 (method)
https://medium.com/@lyhlg0201/http-method-d561b77df7 (method 상세내용)
https://reqbin.com/Article/HttpConnect (Http Connect)
https://dinding.tistory.com/41 (Http Connect)
https://www.qu3vipon.com/idempotence-of-patch (PATCH는 정말 idempotent 하지 않을까?)
https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C (HTTP 상태코드)