登录与授权的区别?
登录:身份认证的过程,输入正确的账号密码 ,服务器确认之后完成登录
授权:把权限授予
Cookie:
起源:购物车,原始的互联网开始的时候一些电商网站提出购物车的功能,并在本地记录,服务器不想记录
工作机制:服务器需要你所保存的数据,服务器就会发过来,再保存在本地,举例:在购物车添加一个苹果,那么如图:
客户端在购物车添加了一个苹果,那么客户端就会往服务器发送一个post请求,body为apple=1;然后服务器返回了该数据,作为cookie
严格来说,cookie属于一个机制,也是header的一部分,现在逐渐在抛弃cookie做登录状态
用cookie来管理登录状态流程:
首先,客户端发送账号密码,服务端接收到登录信息,确认之后记录登录状态: 即username=a;(大概信息,理解意思),然后服务器为这件事再创建一个会话,会话表示在个某个客户端或者用户代理沟通,可能是登录也可能未登录,记录下此状态后,建立一个session,然后用session与之关联,并把该session发给客户端
然后客户端再发送请求的时候,在携带上这个session,服务器端就会根据这个session来判断该用户是否存在,时候处于登录状态,确认完毕,服务器就发送确认数据
然后管理购物车可以这样:
其中session管理登录信息,cart管理购物车信息,同属于cookie
作用:
1.会话管理:登录,购物车等(上述图以解释清楚)
2.个性化:用户偏好,主题,如图:
服务器给我返回的client_id所包含的信息就是主题信息,就像sessionid一样,也是服务器发送给客户端,然后客户端携带的,只是功能不同,如果我想换别的主题了:
我想换成蓝色主题,所以Cookie中的client-id变为123,服务器返回,客户端更新client_id,完成主题更换,每次请求携带的client_id就会成为123
3.Tracking:分析用户行为,如图:
客户端访问某个网站,该网站返回了一张图片,该图片中是属于第三方的,并记录了该网站的信息,这种分析用户行为的网站都不是一个,而是一个站点,来分析多个网站中用户的行为,然后会往第三方网站发请求然后该网站就会记录一下,该请求来自与shop.com,同样的道理,如果这个请求来自淘宝,也会被记录下来,这样就能分析出用户的喜好
注意:cookie是可以有多个的
XSS(Cross-site scripting):HttpOnly 跨站脚本攻击
比如js中有一些恶心信息,把你的有敏感信息的cookie发给别人,那么你的信息就被泄露了,所以在cookie上加一个HttpOnly 限制,防止脚本拿到cookie之后就发走,如图:
所以作用是;本地的脚本看不到,只能用于http的信息交换
XSRF (Cross-site request forgery): Referer 跨站请求伪造
比如你登录一个钓鱼网站,网站上有个图片点击达到银行网站,而我刚刚访问过银行,然后通过cookie这个网站就可以把钱转走,因为刚才访问银行,有cookie,cookie是自动的,无需登录和确认
作用是:来实现哪个网站跳转过来的,如果这个网站服务器是来自于危险网站,则拒绝转账
缺陷:浏览器需要有这个功能,如果不能帮加这个,还是没有作用
Authorization:
1.Basic 基本授权方式
常用方式:
即对 username:psaaword 的格式做一个base64,如图:
然后添加到header里:
Basic后面即生成的base64值
为什么是basic:因为是最基本的信息
缺陷:会有安全问题,一般用https请求,会安全很多,所以需要把用户名和密码加密后或加密前都可以存在本地,不然还需要在不同的页面输入;比如安卓手机root之后把权限给了某个软件,这样某个软件就可能会盗走账号密码,但是这是用户行为,root手机就相当于放弃安全保障
2.Bearer 拿着尚方宝剑的人,即被授予了权限也可以行使同样的权利
使用方式:
OAuth2:第三方认证流程
流程:用我访问掘金,用github登录:
图中:3rd-party.com表示掘金网站,点击登录方式为github时,github会发送一个Authorization Code给掘金,这并不是token,相当于一个保证,比如我在发送这个code的过程中可能会被拦截,还有可能是浏览器的安全问题,导致我直接发送token会被拦截,发送这个code相当于一个意愿,表明我愿意赋予给掘金权限,然后掘金会把这个值发送给服务器:
服务器会把这个值以及 client_secret 发送给github来请求:
其中client_secret是绝对保密的,别人都看不到,sever到github间的链接是绝对安全的链接,是HTTPS的,client_secret来证明身份,表明我确实是我,相当于身份证,这个时候github在足够安全的情况下拿到了足够多的信息来证明对方是安全的,就会把access token 发给服务器
此时,sever拿到了access token ,OAuth2流程结束
然后的操作就是用这个access token完成,比如我要获取github的头像信息,sever就会往github申请:
具体申请信息是这样的:
注意:有的软件是这样做的:sever在获取到token了之后,直接发送给客户端的掘金,然后由掘金申请信息,这样是可以的,但是不是安全的,因为发送给客户端token以及客户端发送给github的过程是不安全的,这就浪费了OAuth2的优点,尽量不要这样
其中有一个非常容易混淆的问题:第三方登录和第三方授权的区别是啥?
第三方授权:原来是我跟github的信息,分享给掘金了,这时第三方是掘金
第三方登录:我登录掘金,github就是第三方了
微信登录:第三方登录,比如我访问一个网站,用微信登录,用的是完整OAuth2过程,目的是为了安全,不是为了省事
自家app使用bearer token (简便的Oauth2)
Refresh Token:流程跟OAuth2一致,就是github在往server发送token的时候发送的是一个Refresh Token ,然后server用这个Refresh Token去申请,github会给一个新的Refresh Token和access token,每申请一次会给一个新的Refresh Token,原来的Refresh Token失效