웹 서비스 메소드는 HTTP METHOD와 같은 말로 이해해도 무방하다. API 서버를 구현하며 Request를 보낼 때 GET과 POST를 이용하는 것이 가장 널리 알려져 있지만 최근 RESTful 형태를 많이 사용하여 PUT, DELETE 등도 생소한 개념은 아닐 것이다.
아래는 기본적인 웹 서비스 메소드의 종류 및 특징이다.
웹 메소드 특징
- GET: 요청하는 내용이 URL에 노출되는 형태이며, Request-URI 뒤에 붙는 query string에는 길이 제한이 있다.
요청을 보내고 응답을 받는 형태로 검색 등에 사용된다. - HEAD: GET과 유사하지만, Response로 BODY를 반환하지 않고 응답 코드만 있다.
응답 내용 없이 정상 호출 여부를 확인할 때 사용하는 Health-Check 페이지 등에 사용한다. - POST: Request body 내용에 데이터를 담아 전송하는데 사용하며, 생성이나 수정 용도로 사용된다.
- PUT: POST 방식과 유사하게 데이터를 전송하는 용도이지만, Update의 성격이 더 강하다.
- DELETE: 요청하는 대상에 대해 삭제하도록 하는 메소드. 안전상의 이유로 해당 메소드는 사용하지 못하게 차단하는 것을 권고한다.
- OPTIONS: 웹서버에서 지원되는 메소드의 종류를 확인하기 위해 사용된다.
웹 서비스 메소드 공격을 위해서 해당 메소드로 허용가능 대상을 확인 후 진행할 수 있어 막아두는 것이 좋다. - TRACE: 요청을 보내면 클라이언트의 요청 메시지를 그대로 반환하여 응답하는 'loop-back' 형태의 메소드.
TRACE 메소드를 사용 시, 클라이언트의 쿠키 정보 및 다양한 정보가 포함될 수 있는데, 이걸 가로채는 공격을 시도할 수 있다고 하니 해당 메소드도 막는 것이 좋다. - CONNECT: 요청한 리소스에 대해 양방향 연결을 할 수 있도록 하는 메소드로, CONNECT을 통해 터널을 열어줄 수 있다.
취약점
보안 취약점 중 "웹 서비스 메소드 설정 공격"은 해당 사이트에서 허용된 웹 서비스 메소드가 어떤 것들이 있나 확인해서 이를 이용한 공격을 할 수 있는 취약점이다. MDN에서 말하는 안전함의 의미는 서버의 상태를 바꾸지 않으면 안전하다고 한다. 이를 설명하기 위한 메소드는 대표적으로 DELETE와 PUT이 있다.
우선 DELETE는 서버에 지정된 리소스 삭제를 요청하기 위한 메소드이고, PUT은 새로운 리소스 등록 또는 변경을 요청하는 메소드이다. 수정 요청의 용도로 더 많이 쓰인다.
즉, 위 2개의 메소드는 삭제와 수정 요청은 서버의 상태를 변경하기 때문에 안전하지 않다고 명시하는 것으로 보인다. 그러므로 GET은 주로 서버의 읽기 요청을 하기 때문에, 안전하다고 한다.
RESTful의 동작을 고려하여 조금 더 알아보자.
먼저 HTTP 1.1 표준에는 다음과 같이 정의되어 있다.
- OPTIONS
- GET
- HEAD
- POST
- PUT
- DELETE
- TRACE
- CONNECT
위의 메소드들을 모두 활성화하면 WebDAV extention에서 아래와 같은 메소드가 추가된다.
- PROPFIND
- PROPPATCH
- MKCOL
- COPY
- MOVE
- LOCK
- UNLOCK
상기 메소드들을 사용하면 웹 서버의 파일을 변경할 수가 있게 돼서 보안에 심각한 문제가 생길 수 있다. 따라서 서버 관리자 입장에선 보통 GET, POST만 사용할 수 있게 하고 나머지는 모두 막아버리는 것이 마음 편하다. 이런 특징이 결국 GET, POST는 안전하고 나머지는 안전하지 않다고 흘러가게 된 것으로 볼 수 있다. 꼭 필요한 상황이 아니라면 GET과 POST 위주로 사용하는 것이 좋을 듯하다.
추가적으로 REST Resource Naming Guide에는 URI를 사용해 CRUD 기능이 수행되었음을 표시하지 않을 것을 권장한다. 즉, URI는 자원에 대한 어떠한 행동을 나타내는 것이 되어서는 안되고, 자원을 독립적으로 식별하는 방식으로 사용되어야 한다. 어떤 CRUD 기능이 수행되는지 표시하기 위해서는 HTTP 요청 방법을 사용해야 한다.
HTTP GET http://api.example.com/device-management/managed-devices //Get all devices
HTTP POST http://api.example.com/device-management/managed-devices //Create new Device
HTTP GET http://api.example.com/device-management/managed-devices/{id} //Get device for given Id
HTTP PUT http://api.example.com/device-management/managed-devices/{id} //Update device for given Id
HTTP DELETE http://api.example.com/device-management/managed-devices/{id} //Delete device for given Id
참고 자료
http://coashanee5.blogspot.com/2017/03/http.html?m=1
https://okky.kr/articles/395308
https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
https://velog.io/@awdsza/HTTPMethod-PUTDELETE%EB%B3%B4%EC%95%88-%EC%9C%84%ED%97%98%EC%84%B1