2013-03-17 5 views
1

속도 제한이 어떻게 이루어 졌는지보고 있었는데, IP를 통한 많은 API (StackOverflow v1 API 포함)의 속도 제한이나 특정 도메인의 사용에 대한 API 키 제한으로 보입니다. 이 작업은 어떻게 안정적으로 이루어 집니까?API에 의한 API 제한 속도

XHR에서 생성 한 요청을 API로 보면 리퍼러 (일반적으로)와 원격 주소가 있습니다. 원격 주소가 유망하다고 생각했는데 요청을 한 사이트가 아닌 웹 사이트를 사용하는 사용자의 주소 인 것 같습니다. 리퍼러는 항상 보내지는 것처럼 보이지만 서버가있을 때 서버에 해당하는 IP를 찾을 수 있다고 생각합니다.

요점은 다음과 같습니다. 일부 유명한 사람들이 그렇게 할 수 있어야합니다. 그들은 그걸 어떻게 햇어?

+0

100 % 확신하지 못했습니다. 그들은 요청의 소스 인 원격 IP 주소를 살펴볼 것입니다. "요청하는 사이트"는 무엇을 의미합니까? – Anorov

+0

그래서 웹 페이지에서 XHR에 의해 요청이 내려지면 사이트를 방문한 사람이 아닌 웹 페이지에서 요금 제한을 받게됩니다. – NickAldwin

+0

그들은 애플리케이션의 사용자가 아니라 애플리케이션을 기반으로 API 키를 제한/전달하려고합니다. 맞습니까? – NickAldwin

답변

2

위조장에서는 이것을 속도 제어라고하며 트래픽 관리에서는 "트래픽 형성"과 유사합니다. 기본적으로 시간당 제한된 사용을 허용하므로 예를 들어 분당 10 회의 요청 만 허용 할 수 있습니다.

각 요청에 대해 원격 주소 (C에서 getpeername())를 결정하면이 기능은 항상 원격 사용자 IP 주소가됩니다. 그런 다음 요청을 처리하는 방법에 대한 시간주기를 간단히 계산하고 제한을 초과하는 경우 무엇이든 할 수 있습니다. 의사 코드에서

Get block for remote ip 
If time-now is new window, then reset usage to zero 
Add one to usage count 
If usage > allowance then ..... 
Else if usage > allowance*0.75 then slow-down 
Else ok 

나는, 그런 그들은 또한 버스트를 허용하고 만 지속적인 부하를 제한하는 경향이 한 시간 등 매 분마다 같은 여러 기간 동안 보통 평균 대부분의 구현을 하나의 기간을 표시하지만, 한 동안 이는 허용하려는 프로필에 따라 다릅니다.

API의 경우 하드웨어 오류가 아닌 요청의 속도가 느려지는 것이 정상입니다. 상대방의 클라이언트가 오류를 처리 할 것이라는 보장은 없습니다. 사용자 화면 인 경우 한계를 초과하여 표시 할 수 있습니다.

물론 원하는 모든 차원, IP 주소, 참조, 브라우저 유형 !, 페이지 URL, 쿠키로 제한 할 수 있습니다. getpeername을 사용하는 경우 공통 개인 라우터 뒤에있는 경우 여러 명의 동시 사용자가 모두 동일한 원격 IP 주소를 가질 수 있습니다.

0

요청의 원격 주소 나 x-forwarded-for 헤더의 첫 번째 IP를 사용합니다.

신뢰하는 역방향 프록시 나 PaaS에서 실행하는 앱의 경우에만 헤더를 사용합니다. 신뢰할 수있는 레벨의 수를 제어해야합니다. nginx 모듈 real-ip를 확인하십시오.

익명 트래픽의 경우 IP 주소를 사용하는 것이 매우 일반적입니다.이 시점에서 사용자에 대해 알지 못하기 때문입니다. 일단 사용자가 인증되면 (개인 또는 앱) IP 대신 ID를 사용하는 것이 좋습니다.