Lo que se quiere hacer es emplear SSL autenticado mutuamente, de manera que el servidor sólo aceptará conexiones entrantes de su aplicación y su aplicación sólo se comunicará con el servidor .
Aquí está el enfoque de alto nivel. Cree un certificado SSL de servidor autofirmado e impleméntelo en su servidor web. Si usa Android, puede usar la herramienta de claves incluida con el SDK de Android para este fin; si está utilizando otra plataforma de aplicaciones, también existen herramientas similares para ellos. Luego, cree un cliente autofirmado e impleméntelo dentro de su aplicación en un almacén de claves personalizado incluido en su aplicación como recurso (keytool también lo generará). Configure el servidor para que requiera autenticación SSL del lado del cliente y solo acepte el certificado del cliente que haya generado. Configure el cliente para que use ese certificado del lado del cliente para identificarse y solo acepte el certificado del lado del servidor que instaló en su servidor para esa parte del mismo.
Si alguien/algo además de su aplicación intenta conectarse a su servidor, la conexión SSL no se creará, ya que el servidor rechazará las conexiones SSL entrantes que no presenten el certificado del cliente que ha incluido en su aplicación.
Un paso a paso para esto es una respuesta mucho más larga de lo que está garantizado aquí. Sugeriría hacer esto en etapas, ya que hay recursos en la web sobre cómo lidiar con el certificado SSL autofirmado en Android (no estoy tan familiarizado con cómo hacerlo en otras plataformas móviles), tanto del lado del servidor como del lado del cliente. También hay un recorrido completo en mi libro, Application Security for the Android Platform, publicado por O'Reilly.
No estoy seguro de si alguna de las respuestas satisfizo su pregunta. Comparta amablemente cómo se acercó al problema que describió. Estoy construyendo una aplicación web basada en REST + AJAX que puede usarse para usuarios no registrados. Al igual que usted, quiero proteger los recursos de los bots. –
Lógicamente, no hay forma de que una API sea realmente privada si se la llama desde una página web donde cualquiera puede ver la fuente y/o controlar los datos que se envían al servidor. Para atrapar bots tienes los trucos habituales como Captcha, pero en última instancia necesitas soporte de back-end (WAF, escalado automático rápido, etc.) para lidiar con la posibilidad de ataques automatizados de tipo DDOS. Siempre que detecte los posibles ataques de DDOS lo antes posible (antes de hacer conexiones de DB, etc.), no es diferente al manejo de los bots que intentan descargar la página en primer lugar. –