2013-06-30 6 views
10

저는 REST 인증의 기본을 가르치려고하기 때문에 지난 며칠 동안 간단한 응용 프로그램 아이디어를 가지고 놀았습니다.REST 인증 및 HMAC/개인 키 (언제 설정해야합니까?)

지금까지 나는 을 가장 잘 모았습니다.은 아마존에서 사용한 것과 같은 HMAC를 구현 한 것입니다.

내가 가장 염려하는 점은 사용자를 인증하기 위해 이 개인 키를 제공하여 HMAC 서명을 시작할 수 있다는 것입니다. HMAC에 서명하는 데 사용되는 개인 키가 으로 전송되지 않아야한다는 것을 계속 읽었지 만, 처음에 어떻게 가져 가나 요?

제 아이디어는 이와 비슷하지만 유효한지 확실하지 않습니다. 사용자를위한

데이터베이스 테이블 :

users (simplified, this would probably be a private key per client app?) 
    id (their public key?) 
    username 
    password? 
    privatekey 

은 HTML/JS 클라이언트를 가정하면이 사용자는이 같은과 API에 올리기 기존의 로그인 페이지가 표시 될 것이다 :

https://example.com/myapp/api/v1/authenticate.json 
POST: username/password 

그 어느 쪽이든을 반환합니다

404:User not found 
200:{ "id" : <id>, "privatekey": <privatekey> } 

클라이언트는 그 키를 어딘가에 저장합니다 LD 로컬 스토리지/쿠키,? 안전한 장소) 및 서버는 다음 공개 키를 확인 할

GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key} 

이, 관련 개인 키를 검색하고 HMAC 서명을 다시 같을 것이다 추가 요청에 서명하는 데 사용 일치하는 경우 우리는 인증 된 요청을 처리합니다.

나는이 권리를 얻고 있습니까? 내 예제에서와 같이 암호가 여전히 필요하다면 개인 키의 역할을 이해할 수 있는지 확신 할 수 없으므로 뭔가 잘못되었다고 이야기하고 있습니다.

답변

11

응용 프로그램 및 응용 프로그램 사용 방법에 대한 자세한 내용을 제공해야한다고 생각합니다. REST 인증을 수행하는 방법에는 여러 가지가 있습니다. 일부는 표준이며 일부는 표준이 아닙니다. 이 단지 몇 가지 예 : 토큰 인증의

  1. Basic authentication over SSL
  2. Digest authentication
  3. 다양한 종류의 (OAuth 2, SPNEGO, 다양한 STS)
  4. HMAC
  5. 클라이언트 SSL 인증서
  6. 서명/암호화 쿠키.

Amazon S3의 경우 사용자가 등록 할 때 "AWS 비밀 액세스 키"를 제공합니다. 나중에 응용 프로그램 코드는 서명을 계산할 수있는 비밀 키를 알아야합니다. (또는 서명 된 요청/URL을 알아야합니다.) 그래서 궁극적으로 "비밀 액세스 키"가 처음 등록시 한 번 이상 유선을 통해 전송됩니다.

당신이 (클라이언트 SSL 인증서와 같은) 공개 키 암호화를 사용하는 경우 - 당신은 모두

  1. 당신이 클라이언트의 공개/개인 키를 생성 개인 키를 전송 피할 수
  2. 서버에 공개 키를 제출 (또는 인증서 신뢰할 수있는 기관이 서명)
  3. 개인 키와 서버로 서명 요청 (또는 nonce)은 공개 키를 사용하여 서명의 유효성을 검사합니다. 당신은 단순히 서버 서명 쿠키를 사용할 수 있습니다 - 당신의 목표는 사용자가 로그인 페이지에서 인증 후 귀하의 사이트에 만든 AJAX 요청을 인증하는 경우

.

+0

API는 새로운 것을 가르치기위한 것일뿐입니다. 그런 의미에서 API를 먼저 구축 한 다음 외부인 인 것처럼 프론트 엔드를 빌드하려고했습니다. 직접 호출하는 대신 내 API 만 사용하고 인증을 사용하도록 요구했습니다. 이렇게하면 내 프론트 엔드가 단순히 API를 소비하게됩니다. Amazon S3가 등록시 비공개 키를 제공한다고 말하면 제 생각에는 확실하지 않은 것입니다. 언제 제 3 자에게 (또는이 경우 직접) 제공합니까? OAuth 2는 유망 해 보인다. – jfrobishow

+0

나는 클라이언트가 외부에서 접근 가능한 웹 애플리케이션이라면, 소스를보고 기본 JS 파일에서 비밀 키 (로컬 또는 쿠키에 저장 됨)를 볼 수있다. 권리? 어떻게 그런 식으로 예방할 수 있을까요? –

관련 문제