개요
내 응용 프로그램에 대한 (REST) API를 만들려고합니다. 초기 / 1 차 목적은 모바일 앱 (iPhone, Android, Symbian 등)이 소비하는 것입니다. 웹 기반 API의 인증 및 권한 부여에 대한 다른 메커니즘을 조사했습니다 (다른 구현을 연구함으로써). 나는 기본 개념의 대부분을 머리에 감쌌지만 여전히 몇 가지 영역에서 지침을 찾고 있습니다. 내가하고 싶은 마지막 일은 바퀴를 재창조하는 것이지만 내 기준에 맞는 표준 솔루션을 찾지 못했습니다 (그러나 내 기준이 잘못 인도되었으므로 자유롭게 비판하십시오). 또한 API를 사용하는 모든 플랫폼 / 응용 프로그램에서 API가 동일하기를 원합니다.
oAuth
내가 제안한 첫 번째 해결책이 될 것임을 알기 때문에 계속해서 oAuth에 대한 이의를 제기 할 것입니다. 모바일 응용 프로그램 (또는 웹 이외의 응용 프로그램)의 경우 인증을 위해 응용 프로그램을 웹 브라우저로 두는 것은 잘못된 것 같습니다. 또한 브라우저가 콜백을 응용 프로그램 (특히 크로스 플랫폼)으로 반환 할 수있는 방법이 없습니다. 나는 그것을하는 몇 가지 응용 프로그램을 알고 있지만 잘못 느꼈고 응용 프로그램 UX에서 휴식을줍니다.
요구 사항
- 사용자는 응용 프로그램에 사용자 이름 / 암호를 입력합니다.
- 모든 API 호출은 호출 애플리케이션으로 식별됩니다.
- 오버 헤드는 최소한으로 유지되며 인증 측면은 개발자에게 직관적입니다.
- 이 메커니즘은 최종 사용자 (로그인 자격 증명이 노출되지 않음)와 개발자 (응용 프로그램 자격 증명이 노출되지 않음) 모두에 대해 안전합니다.
- 가능하면 https를 요구하지 마십시오 (어려운 요구 사항은 아님).
구현에 대한 나의 현재 생각
외부 개발자는 API 계정을 요청합니다. 그들은 apikey와 apisecret을 받게됩니다. 모든 요청에는 최소한 세 개의 매개 변수가 필요합니다.
- apikey-등록시 개발자에게 제공
- 타임 스탬프-지정된 apikey에 대한 각 메시지의 고유 식별자로 두 배로 증가
- 해시-타임 스탬프의 해시 + apisecret
요청을 발행하는 응용 프로그램을 식별하려면 apikey가 필요합니다. 타임 스탬프는 oauth_nonce와 유사하게 작동하며 재생 공격을 방지 / 완화합니다. 해시는 지정된 apikey의 소유자로부터 요청이 실제로 발행되도록합니다.
인증 된 요청 (사용자를 대신하여 수행 된 요청)의 경우 여전히 access_token 경로 또는 사용자 이름과 암호 해시 콤보를 사용하는 것으로 결정되지 않았습니다. 어느 쪽이든 어느 시점에서 사용자 이름 / 암호 콤보가 필요합니다. 따라서 그렇게 할 때 여러 정보 (apikey, apisecret, timestamp) + 암호의 해시가 사용됩니다. 이 부분에 대한 의견을 듣고 싶습니다. 참고로, 해싱없이 암호를 시스템에 저장하지 않기 때문에 암호를 먼저 해시해야합니다.
결론
참고로, 이는 일반적으로 응용 프로그램 내에서만 인증 및 권한 부여를 처리하는 방법 만 API를 빌드 / 구조화하는 방법에 대한 요청이 아닙니다.
임의의 생각 / 보너스 질문
요청의 일부로 apikey 만 필요한 API의 경우, apikey 소유자 이외의 다른 사람이 apikey를 보지 못하도록하고 (정확하게 보내진 이후) 과도한 요청을하여 사용량 제한을 초과하도록하려면 어떻게해야합니까? 어쩌면 나는 이것을 생각하고 있지만 apikey 소유자에게 요청이 확인되었다는 것을 인증 해야하는 것이 없어야합니까? 필자의 경우, 그것은 apisecret의 목적이었습니다. 해시되지 않고 표시 / 전송되지 않습니다.
해시라고하면 MD5 대 hmac-sha1은 어떻습니까? 충분히 긴 데이터 (예 : apisecret)로 모든 값을 해시하는 것이 실제로 중요합니까?
이전에는 사용자 / 해당 소금을 사용자 암호 해시에 추가하는 것을 고려하고있었습니다. 그렇게하려면 응용 프로그램에서 사용되는 소금을 모르고 어떻게 일치하는 해시를 만들 수 있습니까?