http 완벽가이드 2회독 중 나왔던 질문들
원래는 보안적인 측면 때문에 post 메서드를 이용한다고 생각했다.
get요청으로 보낸다면, url에 id/pw와 같은 중요한 사용자 정보가 노출되게 된다. 노출된 url은 캐시 등에 남기 때문에 안전하지 않은 방법이다.
따라서 post요청에 body에 id/pw를 담고 이를 암호화한 https 프로토콜을 이용해 보낸다면, id/pw가 노출되지 않기 때문에 post요청으로 보낸다고 알고 있었다.
책을 읽고 난 후, 다른 방향에서도 생각해 볼 수 있었다.
로그인 요청은 비멱등하다. 로그인이 됬는지 안됬는지 상태를 바꾸기도 하고, 흔히 사용하는 jwt를 생각해봤을때 로그인마다 갱신되기 때문에 매번 요청마다 같은 결과가 반환된다고 보기 어렵다. (물론 로그인을 어떻게 구현했는지에 따라 멱등하게 만들 수는 있을것 같다)
따라서 이러한 비멱등한 요청을 get과 같은 멱등한 메서드를 이용해 보내는 것은 적절하지 않다. get을 이용한다면 예전에 있던 캐싱되어 있던 로그인 정보를 그대로 가지고 올 수 있는 문제점도 있고, 새로고침하거나 했을때 의도치 않게 여러번 로그인 요청이 보내지는 등의 문제가 있을 수 있다.
요청에 대한 결과가 항상 동일함을 의미한다.
(==여러번 같은 요청을 보내더라도 같은 결과가 반환된다는 것을 뜻한다.)
멱등한 메서드는 중복적으로 요청을 보내고, 실패한 요청을 다시 시도할 때 문제가 되지 않는다.
put과 patch가 헷갈려서 따로 정리해보면,
Put을 리소스가 없다면 추가하고 있다면 해당 리소스 전체를 새로 덮어씌우도록 동작한다. 없다면 새로 넣고 있다면 덮어쓰는 형태이기 때문에 매번 동일한 결과를 반환한다고 볼 수 있다.
Patch는 리소스의 어느 한 부분을 수정하기 위해 사용된다. 여기서 이전 요청이 실행된 후에 다라 결과가 달라질 수 있다.(예를 들어 어떤 숫자값을 1씩 증가시키는 경우)
비슷한 개념으로 안전한 메서드가 있다.
안전한 메서드는 서버의 상태를 변경하지 않는 메서드를 말한다. (예시로 요청을 했을때 DB의 상태가 변하지 않는 것 등)
어떤 메서드가 안전하다면 멱등할 것이다. 하지만 반대는 성립하지 않는다.