REST API에 대한 인증 설계


11

나는 생산하고 소비 할 REST 서비스 용 API를 개발 중입니다. 지난 며칠 동안 인증을 잘 처리하는 방법을 알아 내려고 노력했으며 마침내 무언가를 생각해 냈습니다.

응용 프로그램 스택에 대한 다음 사실을 기반으로 이것을 생각해 냈습니다.

  1. 클라이언트 및 서버는 .NET4 (클라이언트 프로파일의 클라이언트 부분)에 있습니다.
  2. WCF REST를 사용하여 서버 노출
  3. 앱의 사용자 이름과 비밀번호를 메모리에 유지하고 싶지 않습니다.

3부터는 서버에서 자격 증명을 확인한 후 클라이언트가 나머지 앱 전체에서 사용할 토큰을 다시 가져 오도록 토큰 인증 형식을 사용하고 싶었습니다. 사용자를 시간 초과하여 웹 버전과 데스크톱 버전 사이에서 사용자를 원활하게 이동할 수 있습니다. 통화 재생 및 변조 방지 방법을 알아 낸 후 다음을 생각해 냈습니다.

  1. 클라이언트는 인증을 시도하기 전에 ECDiffieHellmanCng클래스를 사용하여 Diffie-Hellman 키 페어를 생성합니다 .
  2. 키 쌍의 공개 부분을 사용자 이름 및 암호와 함께 유선으로 전송합니다 (물론 HTTPS를 통해).
  3. 서버는 사용자 이름 / 암호 조합을 인증하고 성공하면 다음을 수행합니다.
    1. 고유 한 세션 토큰을 만듭니다.
    2. 자체 DH 키 쌍을 생성하고 클라이언트가 제공 한 공개 키에서 공유 비밀을 계산합니다.
    3. 데이터베이스의 세션 토큰, 공유 비밀, 사용자 및 "마지막 작업"시간 (롤링 만료 창에 사용)을 기록합니다.
    4. 세션 토큰, 공개 DH 키 및 인증 성공 메시지를 반환합니다.
  4. 클라이언트는 응답에서 DH 키를 가져와 공유 비밀을 계산하고 토큰과 비밀을 모두 메모리에 저장합니다.

이 시점부터 세션 토큰 / 비밀 조합은 대부분의 다른 REST API와 같이 작동하며 요청에 지문이 찍히고 타임 스탬프 된 다음 일종의 HMAC가 생성됩니다. 클라이언트가 서버에 대해 작업을 수행 할 때마다 토큰 / 비밀 쌍을 확인하고 유효하고 만료되지 않은 경우 작업을 허용하고 세션의 마지막 작업 레코드를 업데이트합니다.

나는 명백한 결함을 보지 못하고 아마도 이것을 위해 과도하게 설계되었지만 어느 시점에서이를 수행하는 방법을 배워야합니다. HMAC는 재생 공격을 방지하고 DH 협상은 MITM 공격을 방지하는 데 도움이됩니다 (HMAC / DH 사이에서 머리 위로 실행 가능한 공격은 생각할 수 없습니다).

누구 든지이 구멍을 뚫을 수 있습니까?


DH 키를 생성하는 것이 단순히 어디에서나 HTTPS를 사용하고 평범한 이전 세션 쿠키를 사용하는 것과 비교하여 보안을 추가하는 방법을 보지 못했습니다. HTTPS를 올바르게 사용하면 MITM (Man-in-the-Middle) 및 재생 공격으로부터 이미 보호됩니다.
거짓말 라이언

답변:


5

자신의 것을 발명하기보다는 OpenAM API를 읽고 빌리는 것을 고려해야합니다.

http://forgerock.com/openam.html

OpenAM Wiki는 특히 도움이됩니다

https://wikis.forgerock.org/confluence/display/openam/Home

해당 구성 요소를 사용할 필요는 없습니다. 그러나 API를 사용하면 장기적으로 인생이 더 단순해질 것입니다.


흠, 그것은 나쁘지 않은데,이 경우에 그것을 사용하지 못하게하는 한 가지 : 우리는 .Net 상점입니다. 또한 WCF 서버 측에서 사용하는 것에 대해서는별로 중요하지 않습니다. Google에서 찾을 수있는 스팸이 아닌 링크 중 하나는 WIF 및 WS- 페더레이션을 사용하는 것입니다.
매트 시커

1
@Matt Sieker : "그 구성 요소를 사용할 필요가 없습니다". 자신의 것을 발명하는 대신 API에 대해 읽으십시오.
S.Lott

아, 나는 당신이 무엇을 의미하는지, 요구 사항은 콜백 물건이라고 생각합니다. 흥미 롭습니다.이 프로젝트가 아니라면 미래의 프로젝트를 위해 더 많은 것을 살펴볼 수 있습니다. auth를 하나의 원자 덩어리로 인증하는 대신 약간 분리하여 서버가 클라이언트에서 필요한 것을 제어 할 수 있도록합니다.
Matt Sieker

우리는 처음에 롤을했지만 몇 년 전에 IG Group에서 OpenAM으로 옮겼습니다. 오픈 소스 제품에 매우 만족합니다.
Robert Morschel

2

나는 당신이 자신의 롤을 원하지 않는다는 @ S.Lott에 100 % 동의합니다. 다른 대안 인 Windows Azure ACS (Access Control Service)를 살펴 보는 것이 좋습니다. ACS는 비용이 많이 들지만 매우 저렴하며 (0.01 달러에 10,000 트랜잭션) 많은 인프라가 처리됩니다. WIF는 클라이언트에서 활용됩니다.

이는 표준 기반 / 클레임 기반 솔루션이기도합니다. WCF와 REST 및 ACS를 함께 사용 하는 방법에 대한이 기사를 확인하십시오 .

미래를 생각하고 있다면 방화벽, 파트너 등 외부에 모바일 앱이 있기 때문에 함께 성장할 수있는 메커니즘이기도합니다. 방화벽 외부에 종속성을 추가하여 사용하지 않으려는 경우에도 아이디어가 있는지 확인할 수 있습니다. 매우 매끄 럽습니다.

행운을 빕니다! -계산서

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.