2013-03-07 2 views
4

이 질문은 이전에 여러 가지 형태로 질문되었습니다. 그러나 나는 "https 사용"답변을 찾고 있지 않습니다. 이미 HTTPS를 사용하고 있으며 페이로드의 민감성에 대해 걱정하지 않습니다.iPhone 응용 프로그램에서 REST API를 사용할 때의 보안

그러나 내가 연구하고있는 iPhone 응용 프로그램은 내가 만든 REST API와 이야기하고 있습니다. (응용 프로그램과 서버를 제어 할 수 있으므로 어떤 제안이라도 환영합니다.)

나는 내 "API 키는" 필요가 access_token을 취득으로 전송하고자하는 클라이언트 ID 및 클라이언트 시크릿의 조합을 의미 인증을 위해 OAuth2를 프로토콜을 사용합니다. 그런 다음 모든 요청은 access_token 및 요청 본문의 HMAC가 포함 된 헤더 (클라이언트 비밀번호를 키로 사용)를 사용하여 서버로 전송됩니다. 이 추가의 유일한 이유는 누군가가 access_token으로 API 요청을 할 수 없기 때문입니다.

내가 말하는 API는 애플리케이션을 공개 할 때 공개 될 예정입니다. 그래서 다른 사람들이 API 호출을 할 수 있다는 것에 대해 걱정할 필요는 없습니다.

내가 걱정하는 것은 :

  • 사람들은 내가 내 응용 프로그램에서 오지 않았다 서버 측에서 감지 할 수 있음을 의미한다 (내 응용 프로그램의 클라이언트 자격 증명을 사용하여 API 호출을 할 수있는)
  • 사람들은 내 클라이언트 ID 그들이해야 할 수 있습니다 추가 범위를 남용 할 수있는, 그리고 기존의 API 사용자가 없습니다

내 생각 엔 이외의이 문제에 대한 해결책이 (정말이없는 점이다 UIWebView 사용 및 glor 만들기 ified webapp)하지만 어쨌든 여기에서 물어볼 것이라고 생각했습니다.

앱에서 소비해야하는 클라이언트 ID/클라이언트 비밀을 보호 할 방법을 모두 생각해 낼 수 있습니까?

+0

oauth가 앱에 안전하지 않다는 말을하고 있습니까? oauth 클라이언트는 모든 매개 변수에 서명해야하므로 액세스 토큰과 암호가있는 클라이언트 만 일부 매개 변수를 포함 할 수 있으며 올바르게 서명해야합니다. – danh

+0

@danh 사실 OAuth2는 OAuth1의 일부인 매개 변수에 서명하지 않습니다. 하지만 아니, 비교적 적은 노력으로 누군가 내 앱을 리버스 엔지니어링하고 내 고객 ID와 비밀번호를 얻을 수 있으며 API에 대한 요청을 내 애플리케이션으로 발행 할 수 있습니다. –

+0

아이폰 앱을 구매 한 사람에게 고유 한 식별자를 부여 할 수 있다면이를 단일 사용자의 자격 증명에 연결할 수 있습니다. 이를 통해 iPhone 응용 프로그램을 얻은 클라이언트와 다른 소스에서 API를 호출 한 클라이언트를 구별 할 수 있습니다. – AardvarkSoup

답변

7

나는 이것이 당신이 원하는 답변이 아니라는 것을 알고 있습니다.하지만 불행히도 당신이 절대적인 확신으로 목표를 달성 할 수 있다고 생각하지 않습니다. 하루가 끝나면 제어 할 수없는 클라이언트를 신뢰할 수 없으며 일단 손을 떼면 제어 할 수 없습니다.

두 가지 목표를 달성하려면 API에 액세스하는 클라이언트가 작성한 것인지 확인해야합니다. 이를 수행하는 방법은 공개 키/개인 키 쌍을 사용하는 것입니다. 사인을 위해 사용할 수있는 비공개 키를 클라이언트에 삽입해야합니다. 이 방법으로 서버는 요청이 클라이언트에서 왔고 다른 사람이 아니라는 것을 압니다. 또한 특정 통화를 클라이언트에만 제한 할 수 있습니다.

그러나 정교한 사용자가 리버스 엔지니어링을 수행하고 앱에서 개인 키를 추출하여 소스를 위장 할 수 있기 때문에 이는 위력을 발휘하지 않습니다. 방탄은 아니지만 총알이 내성을 가지지는 않습니다. 그런 작업을 수행하는 데는 많은 작업이 필요하며 특히 버퍼 번짐, 대량 붉은 청어 등의 RE-RE 기술을 사용하는 경우에는 기술적으로 유리합니다.

만약 내가 나는 누군가 당신이 그것을 해킹했다면 어떤 종류의 피해가 생길지 스스로에게 묻는다. 당신이 페이스 북이라면 그것은 파국적이다. 내부 조직에 서비스를 제공하는 경우 큰 문제가 아닐 수도 있습니다. 단 한 번의 악용을 감당할 수 없다면 디자인을 재고해야합니다. 사용자가 제어하지 않는 코드는 신뢰할 수 없으며 일단 다른 사람의 기기에 있으면 클라이언트를 더 이상 제어하지 못합니다.

+0

감사 의견. 'access_token' (또는 나의 클라이언트 ID/비밀)을 얻음으로써 어떤 것도 해킹 할 수있는 것은 아닙니다. 그들이 API에서 API를 요청한 것처럼 보일뿐입니다. 누가 알면, 이것이 Facebook이 webapp로 배포되는 이유 일 수 있습니다. –

+0

당신이 보낸 것처럼 보이지만 요청하지 않은 요청을 몇 가지 허용 할 수 있다면 개인/공개 키 모델을 사용하는 것이 좋습니다. 그렇지 않으면 막혔을 수 있습니다. 나는 이것이 Facebook이 webapp로 배포되는 이유라고 생각합니다 :-) –

+0

@Freedom_Ben, facebook이 이것을 어떻게 처리하고 분산 된 webapp 접근 방식을 더 설명 할 수 있습니까? 또는 더 많은 정보를 얻을 수있는 곳으로 안내해 줄 수 있습니까? 덕분에 – nightograph

관련 문제