Spring 3 + Spring MVC를 사용하여 간단한 REST API를 개발 중입니다. 인증은 Spring Security를 사용하여 클라이언트 토큰으로 OAuth 2.0 또는 기본 인증을 통해 수행됩니다. 이것은 아직 논란의 여지가 있습니다. 모든 연결은 SSL 연결을 통해 강제됩니다.Spring에서 클라이언트 토큰을 기반으로 속도 제한을 구현하는 방법은 무엇입니까?
나는 속도 제한을 구현하는 방법에 대한 정보를 찾고 있었지만 거기에는 많은 정보가있는 것 같지 않습니다. 구현은 여러 웹 서버에서 작동한다는 점에서 분산되어야합니다.
예를 들어 세 개의 API 서버 A, B, C가 있고 클라이언트가 초당 5 개의 요청으로 제한되는 경우 6 개의 요청을하는 클라이언트는 오류로 거부 된 C의 요청을 찾습니다. 하나의 클라이언트가 많은 사용자를 대신하여 요청을 할 수 있으므로
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
그것은 필요는 요청에 포함 된 토큰을 기반으로 작업하고, 각 사용자는 속도는 서버의 IP 주소 대신 제한해야합니다.
설정은 HAProxy로드 밸런서 뒤에 여러 (2-5) 웹 서버가됩니다. 카산드라가 뒷받침되고 memcached가 사용됩니다. 웹 서버는 Jetty에서 실행됩니다.
가능한 해결책 중 하나는 토큰을 추출하고 마지막 X 초 동안 요청을 얼마나 많이했는지 확인하는 사용자 정의 스프링 보안 필터를 작성하는 것일 수 있습니다. 이렇게하면 여러 고객에 대해 서로 다른 요율 한도를 적용 할 수 있습니다.
어떻게 할 수 있습니까? 기존 솔루션이 있습니까? 아니면 자체 솔루션을 작성해야합니까? 전에 많은 웹 사이트 인프라를 수행하지 않았습니다.
필터 아이디어가 올바른 방향입니다. 이미 memcached를 사용하고 있으므로 간단해야합니다. – sourcedelica
필터처럼 보이는 것이 길일 수 있습니다. 마지막 X 분/초 동안 API 사용을 확인할 수 있도록 간격을두고 버킷 시스템을 구현하는 데 유용한 문서를 찾았습니다. -> http://chris6f.com/rate-limiting-with-redis. 그것은 redis를 사용하지만 원리는 memcache 또는 cassandra와 유사해야합니다. –