Django Rest Framework 中的 SessionBased 与 Token 身份验证

ddo*_*meb 10 authentication django session token django-rest-framework

DRF 文档(https://www.django-rest-framework.org/api-guide/authentication/#authentication)指出

令牌身份验证适用于客户端-服务器设置,例如本机桌面和移动客户端。

会话身份验证适用于与您的网站在同一会话上下文中运行的 AJAX 客户端。

然而,大多数关于 Django Rest Framework 身份验证的教程和 StackOverflow 问题/答案都建议在大多数情况下使用令牌身份验证,即使对于 Web 应用程序也是如此。

我正在使用 Django/Django Rest Framework 作为后端、Angular 作为前端来实现一个 web 应用程序。我应该使用哪种身份验证方案?各自的优点和缺点是什么?

anj*_*505 14

基于会话的身份验证

\n

在基于会话的身份验证中,服务器会在用户登录后为用户创建一个会话。然后,会话 ID 存储在 user\xe2\x80\x99s 浏览器上的 cookie 中。当用户保持登录状态时,cookie 将与每个后续请求一起发送。然后,服务器可以将 cookie 中存储的会话 ID 与内存中存储的会话信息进行比较,以验证 user\xe2\x80\x99s 的身份,并发送具有相应状态的响应!

\n

在此输入图像描述

\n

基于令牌的身份验证

\n

许多 Web 应用程序使用令牌而不是会话进行身份验证。在基于令牌的应用程序中,服务器创建带有秘密的令牌并将令牌发送到客户端。客户端存储令牌(通常在本地存储中)并在每个请求的标头中包含令牌。然后,服务器将验证来自客户端的每个请求的令牌并发送响应。

\n

在此输入图像描述

\n

这里最大的区别是 user\xe2\x80\x99s 状态不存储在服务器上,因为状态存储在客户端的令牌内。大多数现代 Web 应用程序使用令牌进行身份验证,原因包括可扩展性和移动设备身份验证。

\n

  • 值得注意的是,Django Rest Framework 中令牌身份验证的默认实现是**不是** JWT。它由数据库支持,因此用户的状态存储在服务器上。https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication (6认同)
  • 正如@Neil 提到的,Rest Framework 中的令牌身份验证不是 JWT (4认同)