http - etag 와 if-match 헤더

유알·2023년 12월 12일
0

시험기간이라 짧게 적겠다.

api를 설계하던 중 이런 생각이 들었다.

리소스의 기존 상태에 의존하는 patch 류의 api를 호출할 때, 클라이언트의 버전과 서버의 버전이 다르면 어떻게하지?

대충 그리자면 이런 상황이다. 몇 가지 해결책을 고민했었는데,
1. PUT 요청으로 리소스 자체를 덮어쓴다.
이 경우,, 리소스 크기가 클 경우 매우 비효율적일 수 있고, 클라이언트 측에 너무 많은 권한이 주어지는 문제가 있었다.

그래서 생각한게, JPA의 낙관적 락 처럼 버전 필드를 삽입하는 거였다. 이 버전이 다른 경우, 서버 측에서 거부하는 방식을 생각했다.

그리고 더 서칭을 하다 보니, HTTP에는 이러한 역할을 하는 헤더가 있었으니,

etag와 if-match 헤더였다.

리스폰스시 etag 헤더에 태그를 붙이고,
요청시 if-match 헤더에 이 태그를 넣어 요청을 보내면 된다.
만약 버전이 다를 경우 412 (Precondition Failed)로 거부하면된다.

동시성에 예민한, 이전의 상태가 영향을 미치는 API를 설계할 때 활용하면 좋을거 같다. 물론, 그것이 가능한 상황이라면, 최대한 stateless하게 설계하는게 가장 좋을 것이다.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글