Tokens web Json. Encabezado nombrar convenciones, formato y problemas de seguridad

2

Implementé mi propio esquema de autenticación y autorización de Json Web Tokens, que se basa en tres tokens: token de acceso, token de referencia y token de actualización. Son generados por el backend o el código de la aplicación y toda la lógica de autorización se implementa en middleware (en el código Lua incorporado en nginx).

Estas son algunas de las preguntas que me están molestando:

  1. ¿Debo firmar mi token de referencia con RSA antes de pasarlo al cliente?
  2. ¿Debo firmar mi token de actualización con RSA? Obviamente, al igual que el token de referencia, no almacena ninguna información crítica y, por lo tanto, no estoy seguro de eso.
  3. ¿Debo firmar mi token de acceso con RSA, si nunca se pasa al cliente y solo se usa en el lado del servidor? Supongo que debería, como en el caso de las contraseñas con hash almacenadas en la base de datos.
  4. ¿Cuáles son las convenciones de nomenclatura para el encabezado HTTP en las que paso mi token de referencia del servidor al cliente? ¿Está bien usar solo un encabezado arbitrario como X-Reference-Token ?
  5. ¿En qué encabezado debo pasar el token de referencia del cliente al servidor? Debería usar Authorization: Bearer ... (parece una convención estándar) o está bien usar el mismo X-Reference-Token: ...
  6. ¿Es seguro (supongo que no) pasar el token de actualización al cliente? Y si no, ¿cómo lo almacenan? El token de referencia se almacena en las cookies del lado del cliente y se pasa con cada solicitud del cliente al servidor, el token de acceso nunca se pasa al cliente y se almacena en la caché del lado del servidor y ¿dónde debo guardar mi token de actualización?
  7. ¿Es seguro usar el valor de token de referencia sin procesar como clave, por lo que obtengo el token de acceso desde la memoria caché del lado del servidor? Digamos que mi token de referencia es solo un GUID, ¿es lo suficientemente seguro como para usar este GUID como una clave por la cual se almacena mi token de acceso? ¿O es más seguro obtener esta clave de GUID mediante algunas transformaciones?
pregunta Jacobian 17.08.2017 - 21:33
fuente

1 respuesta

0

Hay muchas incógnitas aquí, pero esta es mi oportunidad de responder según las mejores prácticas de seguridad en general.

  
  1. ¿Debo firmar mi token de referencia con RSA antes de pasarlo a la   cliente?
  2.   

Las firmas se pueden utilizar para la autenticidad, la integridad y el no repudio. En este caso, la integridad es la única que parece tener sentido. Si esto es requerido, definitivamente debes firmar el token. Es obligatorio, si el token es autodescriptivo, es decir, contiene datos que pueden ser manipulados por el cliente (como un JWT). Escribí publicación de blog sobre integridad. RSA no puede ser requerido. Un simple HMAC puede ser suficiente para usted. Su caso de uso realmente determina si necesita criptografía asimétrica aquí.

  
  1. ¿Debo firmar mi token de actualización con RSA? Obviamente, como referencia.   token, no almacena ninguna información crítica y por lo tanto estoy   No estoy seguro de eso.
  2.   

Consulte 1. Dado que no se lo pasa al cliente y parece ser un token opaco. Puedes salirte sin firmar esto.

  
  1. ¿Debo firmar mi token de acceso con RSA, si nunca se pasa al cliente y solo se usa en el lado del servidor? Supongo que debería, solo   como en el caso de contraseñas con hash almacenadas en la base de datos.
  2.   

Ver 1. Si no se lo pasa al cliente, es imposible que el cliente lo modifique. Puede que aún sea necesaria la integridad, depende de su caso de uso.

  
  1. ¿Cuáles son las convenciones de nomenclatura para el encabezado HTTP en las que paso mi token de referencia del servidor al cliente? ¿Está bien usar sólo algunos   encabezado arbitrario como X-Reference-Token?
  2.   

Sí, está bien. Dado que el esquema es personalizado, no creo que sea perjudicial usar un encabezado personalizado para un token personalizado.

  
  1. ¿En qué encabezado debo pasar el token de referencia del cliente al servidor? ¿Debo usar la Autorización: Portador ... (parece un   convención estándar) o está bien usar la misma   X-Reference-Token: ...
  2.   

Autorización: el portador es probablemente mejor aquí. Sin embargo, parece que en 6. está utilizando cookies para el token de referencia, en cuyo caso no es necesario un encabezado adicional para enviarlo.

  
  1. ¿Es seguro (supongo que no) pasar el token de actualización al cliente? Y   Si no, ¿cómo lo almacenan? El token de referencia se almacena en el lado del cliente   cookies y pasadas con cada solicitud del cliente al servidor, acceso   El token nunca se pasa al cliente y se almacena en el caché del lado del servidor   y ¿dónde debo guardar mi token de actualización?
  2.   

Su esquema es una caja negra para mí, pero parece que el token de acceso nunca llega al cliente, por lo que el token de actualización tampoco debería. En un mecanismo de autenticación regular como OAuth, estos dos tokens requieren la misma cantidad de seguridad. Sin contar el hecho de que los tokens de actualización viven más tiempo.

  
  1. ¿Es seguro usar el valor de token de referencia sin procesar como clave, por lo que obtengo   ¿token de acceso desde la caché del lado del servidor? Digamos, mi token de referencia es   solo un GUID, ¿es lo suficientemente seguro para usar este GUID como una clave por   ¿Cuál es mi token de acceso almacenado? ¿O es más seguro obtener esta clave?   ¿De GUID por algunas transformaciones?
  2.   

De nuevo, tu esquema es una caja negra. Me parece que su token de referencia es en realidad un ID de sesión. En este caso, no debe ser un GUID, sino un token opaco aleatorio, como se describe aquí . Está bien almacenar el ID de sesión como la clave para obtener el token de acceso de su caché.

Todo lo que describí anteriormente se basa en mi comprensión muy limitada de su esquema. En general, no debe ejecutar su propio esquema de autenticación / autorización. Me parece que tiene una aplicación web con administración de sesión que utiliza cookies y un OAuth para acceder a algunos recursos en el servidor.

Echa un vistazo a OAuth, puede simplificar bastante tu vida.

    
respondido por el Daniel Szpisjak 24.08.2017 - 22:33
fuente

Lea otras preguntas en las etiquetas