HTTP QUERY Method: Solving Complex API Queries with RFC 10008
HTTP QUERY Method: Solving Complex API Queries with RFC 10008
RFC 10008은 복잡한 읽기 전용 작업을 수행하기 위해 요청 본문이 필요한 표준화된 방법을 제공하기 위해 새로운 HTTP QUERY 메서드를 정의합니다. 이는 GET 쿼리 매개변수의 제한과 데이터를 조회하기 위해 POST를 사용하는 의미상의 부정확성 사이의 오래된 긴장을 해결합니다.
HTTP QUERY 메서드가 필요한 이유
기존 메서드들은 기술적 안정성이나 API 의미론을 손상시키지 않고 복잡한 관계형 쿼리나 깊게 중첩된 데이터 구조를 효율적으로 처리할 수 없기 때문에 HTTP QUERY 메서드가 필요합니다.
GET의 제한
GET은 데이터를 조회하기 위한 표준이지만 URL의 쿼리 매개변수에 의존합니다. 이 접근 방식은 여러 상황에서 실패합니다:
- URL 길이 제한: 복잡한 필터는 브라우저나 서버의 문자 제한을 초과하는 거대한 URL을 만들 수 있습니다.
- 인코딩 오버헤드: 비 ASCII 또는 특수 문자는 인코딩이 필요해 요청 크기가 증가합니다.
- 보안 및 로깅: 요청 매개변수는 서버와 미들웨어에 의해 종종 로그에 기록되어 민감한 데이터가 노출될 위험이 있습니다.
- 구조 부족: URL에서 배열이나 깊게 중첩된 구조를 표현하기 위한 보편적인 표준이 없습니다 (예:
?roles[]=adminvs?roles=admin).
요청 본문을 가진 GET의 실패
RFC에서 GET 요청에 본문을 명시적으로 금지하는 조항은 없지만 강력히 권장되지 않습니다. 실제로 많은 클라이언트, 프록시, 웹 서버가 GET 본문을 일관되게 처리하지 못합니다—일부는 이를 완전히 거부하고, 다른 일부는 본문을 전혀 사용하지 않습니다. 이는 프로덕션 환경에서 본문이 있는 GET을 신뢰할 수 없는 선택으로 만듭니다.
POST의 의미적 문제
개발자들은 종종 쿼리를 위해 요청 본문을 보내는 우회 방법으로 POST를 사용합니다. 그러나 POST는 비멱등(non-idempotent)으로 정의되며 리소스 생성이나 처리에 사용됩니다. 이는 여러 문제를 야기합니다:
- 재시도: POST는 비멱등이므로 실패 시 자동 재시도가 위험합니다.
- 캐싱: 프록시와 미들웨어는 POST 요청을 읽기 전용으로 자동 식별할 수 없어 표준 캐싱 메커니즘을 사용할 수 없습니다.
QUERY 메서드의 기술 사양
QUERY 메서드는 기능적으로 GET과 유사하지만 요청 본문을 명시적으로 지원하도록 설계되었습니다. 주요 특성은 다음과 같습니다:
- 안전성 및 멱등성: GET과 마찬가지로 QUERY는 안전하고 멱등하도록 정의되어 서버 상태를 변경하지 않습니다.
- 캐시 가능성: QUERY 요청은 캐시될 수 있습니다. 그러나 구현에서는 서로 다른 쿼리 매개변수에 대해 올바른 데이터를 반환하도록 요청 본문을 캐시 키에 포함시켜야 합니다.
구현 시 고려사항 및 주의점
표준화에도 불구하고 QUERY 메서드는 모든 검색 엔드포인트에 대한 즉시 대체가 아닙니다. 개발자는 다음 제약을 고려해야 합니다:
- 제한된 생태계 지원: 현재 QUERY에 대한 지원은 제한적입니다. 많은 프록시, 방화벽, 웹 서버가 여전히 이 메서드를 거부할 수 있습니다. 예를 들어 Kreya API 클라이언트가 버전 1.20에서 지원을 추가했지만, 광범위한 채택에는 수년이 걸릴 수 있습니다.
- 링크 가능성: QUERY 요청은 쿼리 매개변수가 URL이 아닌 요청 본문에 존재하기 때문에 간단한 URL로 북마크하거나 공유할 수 없습니다.
- 캐싱 복잡성: 캐시 키를 요청 본문에서 도출해야 하므로 GET에 비해 QUERY에 대한 맞춤형 캐시 구현이 더 복잡합니다.
커뮤니티 관점 및 비판
엔지니어들 사이의 논의는 명시적 표준을 중시하는 사람들과 기존 관행을 따르는 것을 선호하는 사람들 사이에 갈등이 있음을 보여줍니다.
새로운 메서드에 대한 찬성 논거
일부는 GET에 본문을 사용하는 것이 "해킹"이며 표준화되지 않아야 한다고 주장하면서, 명시적인 메서드가 유일한 올바른 진보 방법이라고 주장합니다.
새로운 메서드에 대한 반대 논거
비평가들은 기존 관행인 GET에 본문을 사용하는 방식을 따랐어야 한다고 제안하며, 새로운 동사를 도입하면 레거시 인프라와의 충돌을 초래할 수 있다고 지적합니다. 한 사용자는 HTTP/1.1만 지원하는 비용이 많이 드는 SSL 가로채기 프록시 장비가 알 수 없는 HTTP 동사를 만나면 "DoS 위험"이 있다고 언급했습니다.
다른 개발자들은 요청 본문을 지원하기 위해 새로운 메서드를 추가하는 것이 HTTP 사양의 장기적 관련성을 유지하는 최선의 방법인지 의문을 제기하며, 이는 견고한 설계라기보다 최소 저항의 경로일 수 있다고 제안합니다.
요약: RFC 10008은 복잡하고 읽기 전용이며 요청 본문이 필요한 요청에 대해 POST 대신 안전하고 멱등적인 대안으로 HTTP QUERY 메서드를 도입합니다.
제목: HTTP QUERY Method: Solving Complex API Queries with RFC 10008