2012-06-14 5 views
6

사용자에게 내 애플리케이션 데이터베이스를 활용하고 정보를 얻을 수있는 웹 서비스가 있습니다. 사용자는 API 키를 등록하고 요청할 때이를 제공해야합니다. 모든 것은 잘 작동하지만 키를 등록한 사용자가 실제로 요청을하고 있지 않은지 다른 사람이 아닌지 확인하는 방법은 무엇입니까?REST 웹 서비스 및 API 키

저는 지난 2 일 동안 해결책을 찾고 있지만 지금까지 생각해 본 것이 없습니다.

+0

JAVA 또는 PHP (또는 기타)를 사용합니까? – sp00m

+0

서버 측 언어가 PHP – slash197

+0

@Laurent가 대답 했으므로 OAuth 프로세서를 살펴볼 수는 있지만 OAuth2를 제안 할 것입니다. 게시물이 조금 오래된 경우에도 PHP의 구현 방법을 찾을 수 있습니다 (http://stackoverflow.com/q/4875420/1225328). PS : Google과 Facebook은 모두 개발자가 API와 통신 할 수 있도록 OAuth2를 사용합니다. – sp00m

답변

10

서명 된 요청을 사용해야합니다. 기본적으로 그것은 그런 식으로 작동합니다

  • 당신은 사용자에게 클라이언트 만이 알고있는 API 키 에 "비밀"(임의의 문자열)을 얻었다.
  • 요청할 때마다 "서명"매개 변수가 요청에 추가됩니다. 이 서명은 기본적으로 요청 매개 변수의 해시 + API 키 + 다른 매개 변수 (아래 참조) + 비밀입니다.
  • 비밀을 알고 있기 때문에 서명이 올바른지 확인할 수 있습니다.

재생 공격을 피하기 위해 믹스에 nonces와 timestamp를 추가 할 수 있습니다. nonce는 단순히 각 요청에서 클라이언트가 증가시켜야하는 숫자입니다. 요청을 받으면 전에이 nonce/timestamp를 이미 받았는지 확인합니다. 그렇게했다면 요청을 거부합니다 (리플레이 공격 일 가능성이 큽니다). 그렇지 않다면 나중에 찾을 수 있도록 데이터베이스에 nonce/timestamp를 저장하십시오.

이것은 다소 요청이 OAuth에 서명 된 방법입니다. 링크의 예를 살펴보십시오.

+0

감사! 흥미로운 것 같아, 이걸 조사해야 해. – slash197

+0

사용자가 자신의 비밀 키를 제공하면 어쨌든 자신의 신원을 제대로 확인할 수 없습니다. 기술 (API가 아닌)은 API 키와 비밀 키의 적절한 사용을 지시해야합니다. 그럼에도 불구하고 이것은 좋은 정보입니다. 트래픽 스니핑 (API 키/매개 변수) 또는 요청 매개 변수를 추측하여 재생 공격이 적용되는 시나리오는 무엇입니까? – KyleM

+0

@KyleM, 네, MITM 공격을 막는 것입니다. 연결이 https를 넘는다면 덜 중요 하리라 생각됩니다. –

2

REST API 호출 인증에 2 부분이 있습니다. 사용자가 서비스에 등록하면 일반적으로 해당 사용자를 식별하는 KEY를 지정합니다. 때로는 충분합니다. 그러나이 키는 공유되거나 도난 당할 수 있습니다. 이 경우 귀하의 서비스는 여전히 KEY가 유효하다고 간주합니다. 이제 도용 등을 막기 위해 비밀 키를 배포 할 것입니다. 이 키는 REST API 요청과 함께 전송되지 않습니다. 이 키는 API 요청의 단방향 해시를 수행하고 서명 (HMAC)을 만드는 데 사용됩니다.

이 서명과 API 요청 (URL 형식의 HTTP 요청)은 API 서버로 전송됩니다. 서버는 URL의 단방향 해시를 수행하고이 사용자의 개인 키를 사용하여 서명과 비교합니다. 일치하면 리퀘 스터가 개인 키에 액세스 할 수 있음을 "가정"하므로 요청이 유효합니다.

재생 공격을 피하기 위해 nonce (이전 포스터에서 제안한 바) 외에 해시 체인을 사용할 수도 있습니다.