¿Deben usarse las cookies en una API RESTful?

77

Estoy específicamente interesado en cómo los usuarios realizan operaciones autorizadas / autenticadas en una API web.

¿Las cookies de autenticación son compatibles con la filosofía REST y por qué?

Brandon Linton
fuente
duplicado exacto de la autenticación
posible duplicado de la arquitectura
FrustratedWithFormsDesigner
1
@JarrodRoberson Comprendí que las respuestas en otro sitio no calificarían la pregunta como duplicada aquí
Tom Squires,
55
@JarrodRoberson basado en las preguntas frecuentes de cada sitio, diría que la pregunta pertenece a este sitio y no a Stack Overflow. Estoy interesado en la metodología / filosofía de diseño y compensaciones con respecto a este aspecto de la arquitectura RESTful. Stack Overflow está destinado a preguntas de implementación, donde este sitio trata más sobre metodologías de diseño y compensaciones.
Brandon Linton
1
Estoy de acuerdo con @BrandonLinton aquí, la pregunta es demasiado amplia para Stackoverflow, se trata de la arquitectura y la metodología de diseño. El OP quiere mejores prácticas y patrones, sugerencias y trucos, no una respuesta específica, por lo tanto, no se ha especificado ningún idioma. Por lo tanto, pertenece aquí.
dooburt

Respuestas:

81

Un servicio ReSTful ideal permite a los clientes (que pueden no estar en el navegador) realizar cualquier tarea necesaria en una solicitud ; porque el estado completo necesario para hacerlo lo tiene el cliente, no el servidor. Dado que el cliente tiene el control total del estado, puede crear el estado por sí mismo (si eso es legítimo), y solo hablar con la API para "hacerlo".

Requerir cookies puede dificultarlo. Para los clientes además de los navegadores, administrar cookies es un inconveniente bastante grande en comparación con los parámetros de consulta, los encabezados de solicitud simples o el cuerpo de la solicitud. Por otro lado, en el navegador, el uso de cookies puede hacer muchas cosas mucho más simples.

Así que una API podría mirar primero en la Authorizationcabecera de los datos de autenticación que necesita, ya que eso es probablemente el lugar donde los clientes distintas de los navegadores preferirán lo puso, pero para simplificar y agilizar los clientes basados en navegador, puede también comprobar si hay una cookie de sesión para el inicio de sesión del lado del servidor, pero solo si Authorizationfalta el encabezado normal .

Otro ejemplo podría ser una solicitud compleja que normalmente requiere una gran cantidad de parámetros establecidos. Un cliente no interactivo no tendría problemas para agrupar todos esos datos en una sola solicitud, pero una interfaz basada en formularios HTML podría preferir dividir la solicitud en varias páginas (algo así como un conjunto de páginas de 'asistente') para que los usuarios no se presenten con opciones que no son aplicables según las selecciones anteriores. Todas las páginas intermedias podrían almacenar los valores en cookies del lado del cliente, de modo que solo la última página, donde el usuario realmente envía la solicitud, tenga algún efecto secundario en el servidor. La API podría buscar los atributos necesarios en el cuerpo de la solicitud y volver a mirar las cookies si los parámetros necesarios no estuvieran allí.

Editar: en RE al comentario de @ Konrad a continuación:

Los tokens en comparación son más difíciles de implementar, especialmente porque no puede invalidar fácilmente el token sin almacenarlos en algún lugar.

er ... estás validando las cookies en el lado del servidor, ¿verdad? El hecho de que le haya dicho al navegador que descarte una cookie después de 24 horas no significa que lo hará. Esa cookie podría ser guardada por un usuario altamente técnico y reutilizada mucho después de que haya "caducado".

Si no desea almacenar los datos de la sesión en el lado del servidor, debe almacenarlos en el token (cookie u otro). Un token de autenticación autónomo a veces se llama macarrón. La forma en que esto se pasa entre el cliente y el servidor (ya sea por cookie, como encabezados adicionales o en la entidad de solicitud) es totalmente independiente del mecanismo de autenticación.

SingleNegationElimination
fuente
44
+1, definitivamente me gusta la practicidad de usar el encabezado de Autorización pero "recurrir" a las cookies dependiendo de lo que funcione mejor para el cliente.
Brandon Linton
No estoy de acuerdo con "Para los clientes además de los navegadores, administrar cookies es un gran inconveniente ...". La mayoría de las bibliotecas de cliente HTTP admiten cookies, por ejemplo, con HttpClient.NET puede usar cookies sin ningún problema y realmente no necesita pensar en ello. Los tokens en comparación son más difíciles de implementar, especialmente porque no puede invalidar fácilmente el token sin almacenarlos en algún lugar.
Konrad el
1
@Konrad solo porque es fácil en algunos clientes que no son navegadores no significa que sea fácil en todos ellos. Está bien si solo necesita admitir el cliente particular que utiliza, pero interpreté la pregunta sobre API públicas. en curlo wget, administrar cookies es bastante inconveniente y realmente tienes que pensar mucho en ellas. Respondí a tu otro punto editando mi respuesta.
SingleNegationElimination
Tenga en cuenta que simplemente aceptar cookies abre vulnerabilidades CSRF. Consulte también security.stackexchange.com/a/166798
Michael Osl el
14

Sí y no: depende de cómo lo use.

Las cookies si se usan para mantener el estado del cliente en el cliente, para el cliente, del cliente y por el cliente, entonces son relajantes.

Si está almacenando el estado del servidor en la cookie, básicamente está transfiriendo la carga al cliente, lo que no es tranquilo.

Entonces, ¿cuáles son algunos ejemplos?

Sosegado:

  • Detalles de autenticación o 'ha iniciado sesión' un poco
  • última página vista o lugar en la aplicación, etc.

No es tranquilo

  • Almacenar información de la sesión

La tranquilidad proviene de la apatridia del servidor. Los clientes pueden mantener el estado de la aplicación y enviarla al servidor para decir dónde están para que el servidor pueda decidir a dónde ir desde allí. Básicamente, las sesiones / estados necesitan datos históricos y dependen de solicitudes pasadas, por así decirlo, las aplicaciones relajantes idealmente no lo son (no es viable tener una aplicación 100% pura si va a tener una pantalla de inicio de sesión :)

Doctor
fuente
10
Si almacena un indicador "isLoggedIn" en el cliente, es mejor que no use ninguna autenticación.
tdammers
Esto definitivamente tiene sentido: almacenar el estado de la aplicación del lado del cliente no sería coherente con REST, pero la información del cliente que usa para representarse a sí misma parece estar bien.
Brandon Linton
1
Me gustaría agregar que poner información de autenticación en las cookies deja abierta la posibilidad de ataques de falsificación de solicitudes en sitios cruzados. Hay mejores formas, sugiero copiar Amazon: docs.aws.amazon.com/AmazonS3/latest/API/…
Dobes Vandermeer
@tdammers ¿qué pasa si la bandera "isLoggedIn" está en un JWT? Entonces eso debería ser seguro, siempre que el JWT se emita y verifique correctamente.
Aaron J Spetner
@AaronJSpetner: No use JWT para sesiones .
tdammers
12

Uno puede usar cookies. REST les permite.

REST requiere que cualquier información de sesión se almacene en el lado del cliente, pero cuando se trata de autenticación, parte de la información debe permanecer en el lado del servidor por razones de seguridad.

De una de mis publicaciones de blog , hay un acuerdo general de que los datos de autenticación se consideran fuera del alcance con respecto a REST. Por lo tanto, está bien que los servidores mantengan parte de los datos de esta sesión.

Jérôme Verstrynge
fuente