当前位置: 首页 > Web前端 > HTML

HTTPBasic、Session、Token三种认证方式介绍

时间:2023-04-02 21:16:14 HTML

1.概述本文介绍了HTTPBasic、Session、Token这三种认证方式。基础证明:户籍部门给你发了一张身份证。每次去办事都要带身份证,后台会拿着身份证上系统查。会话认证:户籍部门给你发了一张身份证,但只告诉你身份证号。每次去办事只需要报身份证号,后台会查是否有效。令牌认证:户籍部门给你发了一张具有防伪功能的身份证。每次去办事,只要出示这张卡片,它就会知道,你一定是自己人。2.HTTPBasic认证这是最基本的认证方式。在这种认证方式下,用户每次发送请求时,请求头中都必须携带能够通过认证的身份信息。交互过程如下:一开始,客户端发送一个没有身份信息的请求。服务器返回401Unauthorized状态,并在返回标头中指示它需要使用Basic方法进行身份验证:WWW-Authenticate:Basic。客户端重新发送请求,在请求头中包含身份信息:Authorization:BasicaHk6bXlwYXNzd29yZA==。服务器验证请求头中的身份信息,并相应地返回200OK或403Forbidden状态。之后,客户端每次发送请求时,都会在请求头中携带身份信息。客户端服务器------------1---------------------------------------->GET/HTTP/1.1<------------------------2HTTP/1.1401未经授权的WWW-Authenticate:Basic3------------------------------------------->GET/HTTP/1.1Authorization:BasicaHk6bXlwYXNzd29yZA==<------------------------4HTTP/1.1200OK5--------------------------------------->GET/another-path/HTTP/1.1Authorization:BasicaHk6bXlwYXNzd29yZA==传输的身份信息为<用户名>:<密码>Base64编码的字符串。比如本例中的aHk6bXlwYXNzd29yZA==,经过base64解码后,就变成了hy:mypassword。这种认证方式的优点是简单易懂。缺点是:不安全:认证身份信息以明文形式传输,需要与https配合使用。效率低:服务器在处理请求时,每次都需要验证用户名、密码等身份信息。3、Session认证这种认证方式结合了Session和Cookie。服务器将会话信息以Session对象的形式保存在服务器的内存、数据库或文件系统中,并以Cookie的形式返回对应的Session对象ID值SessionID给客户端,SessionID保存在客户端的曲奇饼。这是一种有状态的认证方式:服务端保存Session对象,客户端以Cookie的形式保存SessionID。交互过程如下:客户端在登录页面输入用户名/密码等身份信息。服务端验证身份信息,通过后生成一个Session对象,保存到服务端,并将SessionID值以Cookie的形式返回给客户端。客户端将接收到的SessionID保存在Cookie中,后续每次请求都会在请求头中携带SessionIDCookie。服务器从请求的Cookie中获取SessionID,查询其对应的Session对象获取身份信息。客户端退出会话后,客户端删除SessionIDcookie,服务器删除Session对象。如果客户端以后需要再次登录,则需要重新生成Session对象和SessionID。优点:更安全:客户端不需要每次请求都发送身份信息,只需要发送SessionID即可。更高效:服务器每次处理请求时不需要验证身份信息,只需要通过SessionID查询Session对象即可。缺点:可扩展性差。会话对象存储在服务器端。如果它们存储在多台服务器上,就会出现一致性问题。如果将它们存储在单个服务器上,则无法适应用户增长。基于Cookie的SessionID不能跨域共享,同一用户的多个客户端(如浏览器客户端、APP)不能共享SessionID。基于Cookie的SessionID很容易被拦截并产生CSRF攻击。4.Token认证这是SPA应用和APP经常使用的一种认证方式。它是一种无状态的身份验证方法。客户端先将用户信息发送给服务器,服务器根据用户信息+私钥生成唯一的Token返回给客户端。Token只保存在客户端,之后客户端的每个请求头都携带Token,而服务端只是通过计算(不查询)来验证用户。客户端服务器------------1---------------------------------------->GET/HTTP/1.1<------------------------2HTTP/1.1401未经授权的WWW-Authenticate:Token3--------------------------------------->GET/HTTP/1.1Authorization:Tokenf613d789819ff93537ee6a<------------------------4HTTP/1.1200OK5---------------------------------------->GET/another-path/HTTP/1.1Authorization:Tokenf613d789819ff93537ee6a优点:Token只保存在客户端,所以不会影响服务器端的可扩展性。为用户生成的令牌可以在多个客户端之间共享。缺点:Token包含了用户的所有信息,而不是像SessionID那样只是一个ID值,所以会增加每次请求包的大小。目前广泛使用的是基于JWT(JSONWebTokens)的Token认证方式。初学者参考DjangoSession、Token认证方法