안전함 (HTTP 메서드)
HTTP 메서드가 서버의 상태를 바꾸지 않으면 그 메서드가 안전하다고 말합니다. 다른 말로 하면, 읽기
작업만 수행하는 메서드는 안전합니다. 흔히 쓰이는 HTTP 메서드 중에서는 GET
, HEAD
,
OPTIONS
가 안전합니다. 모든 안전한 메서드는 멱등성 또한
갖지만, 모든 멱등성을 지닌 메서드가 안전한 것은 아닙니다. 예컨대 PUT
과 DELETE
는 둘 다 멱등성을 가졌지만 안전하지는 않은 메서드입니다.
그러나, 안전한 메서드가 읽기 전용의 의미를 내포하긴 하지만, 서버가 요청 정보와 통계 등을 기록함으로써 자신의 상태에 변경을 가하는 것도 가능합니다. 안전한 메서드 호출의 중요한 부분은 그 메서드를 호출해도 클라이언트가 서버의 상태 변화를 직접 요청하는 것이 아니므로 서버에 불필요한 부하를 주지 않을 것이란 점입니다. 브라우저는 안전한 메서드라면 서버에 해를 끼치지 않을 것임을 알 수 있기 때문에 자유롭게 호출할 수 있습니다. 이런 점을 활용해서 브라우저가 별다른 위험 없이도 프리페칭과 같은 동작을 수행할 수 있는 것입니다. 웹 크롤러 역시 안전한 메서드의 호출에 의존합니다.
안전한 메서드가 정적 파일만 제공해야 할 필요는 없습니다. 생성된 스크립트가 안전함을 보장하는 한, 서버는 안전한 메서드에 대한 응답을 즉시 생성할 수 있습니다. 다른 전자 상거래 웹 사이트에 주문을 넣는 것과 같이 외부 효과를 유발하는 것은 안됩니다.
메서드의 안전함을 준수하는 것은 온전히 서버 애플리케이션의 책임으로, Apache, Nginx, IIS 등 웹 서버 스스로는 안전함을
강제하지 못합니다. 서버 애플리케이션은 특히 GET
요청을 받았을 때 자신의 상태가 바뀌지 않도록 해야 합니다.
다음은 서버 상태를 바꾸지 않는, 안전한 메서드의 호출입니다.
GET /pageX.html HTTP/1.1
다음은 서버 상태를 바꿀 수도 있는, 안전하지 않은 메서드의 호출입니다.
POST /pageX.html HTTP/1.1
마지막으로 멱등성을 가졌지만 안전하지는 않은 메서드의 호출입니다.
DELETE /idX/delete HTTP/1.1