开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
登录
登录是我们在一个web应用中最常见的功能,一个账号,一个密码,一个验证码,虽然界面看起来简单,但实际是比较复杂的
想先知道登录,就必须知道http是啥
http
当我们登录的时候,输入账号和密码,点击登录,用户向服务器发起tcp请求,服务器根据请求的内容,返回界面给用户,页面加载完成,连接断开。
http最大的特点就是,每一次通信就是一个独立的连接,通信完成,连接就会断开。
为啥浏览器和服务器要断开连接?
如果长时间连接,就会占用太对的服务器资源,服务器能同时服务的浏览器就会变少,但是连接断开就会有新的问题,如果我们去点击我们的个人信息,向服务器请求查询我们的信息,浏览器需要建立新的连接,但是服务器如何识别我的身份?
session和cookie
当用户把账号密码提交给服务器,服务器验证通过,服务器会为我这次请求创建一个session,含义叫会话,
服务器会为这次会话做一个临时性记录,将用户的基本信息登录状态,保存在session,这个session有唯一的一个id号,当服务器向客户端返回时,会将这个id和数据一起返回给客户端,
至此有了cookie技术,服务器响应客户端时,服务器将唯一的session的id给了客户端,这是验证身份最重要的凭证,浏览器要妥善保存,
下次访问,携带这个访问服务器,这样服务器就能知道你是谁,以及你有没有登录,这种解决方案叫会话跟踪技术,
浏览器保存的每一条记录,就是cookie。cookie是全球通用的,API都是通用的,每一条cookie记录,本质上就是一个键值对。
cookie的隐患
如果采用cookie加session的验证机制,浏览器和服务器会自动保存,发送,携带cookie,开发完全可以不知道cookie
如果有这样一个场景
你登录了一个银行账户,域名是a.com,在你没有退出的情况下,你访问了b.com,在他页面当中,image标签访问a.com,并且是转账请求,对于a.com来说,这是一个合法请求,主要看他有没有携带cookie,由于cookie是自动携带的,所以很危险
但是现实中不会发生,cookie是有自己的防御机制的
token机制
token算是另外一种形式的cookie,只不过要我们自己维护,并不属于浏览器,当第一次登录成功后,服务器会生成token,返回数据的时候,会将这个token字符串返回给客户端,前端会将这个token,保存起来,下次请求携带上
如果采取token,那么b.com想要访问a.com,但是token不属于浏览器,浏览器不会对token做任何处理,如果没有token,那就无法访问a.com,b.com发出的任何请求都是非法的,这样彻底避免了跨域访问的安全隐患,这种恶意访问攻击,叫做CSRF(跨站请求伪造)攻击