Django Rest Framework 中基于会话的身份验证与令牌身份验证

SessionBased vs Token Authentication in Django Rest Framework

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

Token authentication is appropriate for client-server setups, such as native desktop and mobile clients.

Session authentication is appropriate for AJAX clients that are running in the same session context as your website.

然而,大多数关于 Django Rest Framework 身份验证的教程和 Whosebug questions/answers 建议在大多数情况下使用令牌身份验证,即使是 webapps。

我正在实施一个网络应用 usingDjango/Django Rest Framework 作为后端,Angular 作为前端。 我应该使用哪种身份验证方案? 各有什么优缺点?

Session 基于身份验证

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

基于令牌的身份验证

许多网络应用程序使用 JSON 网络令牌 (JWT) 而不是 sessions 进行身份验证。在基于令牌的应用程序中,服务器使用秘密创建 JWT 并将 JWT 发送给客户端。客户端存储 JWT(通常在本地存储中)并在每个请求的 header 中包含 JWT。然后,服务器将使用来自客户端的每个请求验证 JWT 并发送响应。

这里最大的区别是用户的状态不存储在服务器上,而是存储在客户端的令牌中。出于可扩展性和移动设备身份验证等原因,大多数现代 Web 应用程序都使用 JWT 进行身份验证。