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 进行身份验证。
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 进行身份验证。