Token之关于基础概念(一)

摘要:
谈论令牌。我总是在工作中遇到它。首先,什么是令牌?服务器只需要确认令牌是否由自己签名和颁发。签名和验证都在服务器上执行。

阔别了一阵,再次提笔,有些感慨。

聊聊Token吧,以前工作中总是遇到。

首先明确什么是token?

一些关键标签:服务端签发的一个字符串,客户端的请求令牌,用户第一次使用用户名密码登录后生成,在token的有效期内使用token登录无需用户名密码

明确之后我们来聊聊,token的生成及请求过程:

1、客户端带上用户名密码请求登录(前端校验通过)

2、服务器收到请求,校验用户名密码(服务端校验通过)

3、服务端签发token,并写进cookie发送给客户端

4、客户端收到token后会存入cookies或者LocalStorage中

5、客户端请求服务端每次都会携带这串token(具体携带方式:放消息体里,或者url直接携带)

6、服务端收到token后,验证通过,开始返回相应数据(验证不通过会返回错误信息)

7、token在服务端会设置一个有效期,每次请求都会验证是否token过期和token的有效性

  • 注意:token在url中被携带时注意浏览器的url截断问题,有可能会导致登录验证不通过(经验之谈,苹果设备上见过,尤其是从端跳H5)从测试角度去看的这个问题。

那为什么要用token?

1、支持跨域访问,token支持跨域访问,但cookie不支持

2、可以避开同源策略(后面会写写我理解的同源策略)

3、token是无状态的,可以多个服务器间共享(无状态在后面写写)

4、token可以避免CSRF攻击(跨站请求伪造)

5、易于扩展

扩展:

  那啥是CSRF呢?简单理解,就是攻击者盗用了你的身份信息,并完成以你的名义发起的恶意活动。至于多恶意,比如:转账!发邮件!购物!……

至于完成一次CSRF攻击必要的两个步骤:

  1、首先登了一个正常的网站A,并且在本地生成了cookie

  2、在cookie有效时间内,访问了危险网站B(就获取了身份信息)

Q:那我不访问危险网站就完了呗?

A:危险网站也许只是个存在漏洞的可信任网站!

Q:那我访问完正常网站,关了浏览器就好了呀?

A:即使关闭浏览器,cookie也不保证一定立即失效,而且关闭浏览器并不能结束会话,session的生命周期跟这些都没关系。

当然CSRF不在本次研究重点!

 啥是同源策略捏?就是不同源的客户端脚本在没有明确授权情况下,不准读写对方的资源!

问题来了:啥是源?

源就是协议,域名,端口号。

同源:就是url里的源都相同。(听着像废话!哈哈

举例:http://www.abcd.com:80 

http://www.abcd.com/dir/index.html(同源)

http://www.ah.com/dir1/index.html(域名不同,不同源)

https://www.abcd.com/dir2/page.html(协议不同,不同源)

http://www.abcd.com:8888/dir3/page.html(端口号不同,不同源)

所以,如果假设a.com中的js脚本要是采用ajax去读写b.com中的资源文件数据是会报错滴!

但有不收同源策略限制的:1、页面中的连接,重定向及表单提交 2、跨域资源的引入可以,但js不能读写加载的内容,如:iframe,img,link,<script src='http://t.zoukankan.com/yuki-nana-p-14001600.html'>等等。

 那啥是跨域?想要操作另一个源下的对象就需要跨域!

至于怎么跨域,或者跨域的实现方式,咱们以后再讨论!

  易于扩展:比如有多台服务器,使用负载均衡,第一次登录转发到了A,A中seesion缓存了用户的登录信息,第二次登录转发到了B,这时候就丢失了登录状态,,当然这样也是有解决方案可以共享session,但token只需要所有的服务器使用相同的解密手段即可。

 无状态:服务端不保存客户端请求者的任何信息,客户端每次请求必须自备描述信息,通过这些信息来识别客户端身份。服务端只需要确认该token是否是自己亲自签发即可,签发和验证都在服务端进行。这里面其实涉及加密方法,后续讨论,给自己立个flag!

   有状态:我们说的cookie和session就是有状态的,第一次客户端请求,服务端产生session,然后将信息返回给浏览器,浏览器会将session中的关键数据,保存到本地的cookie中,然后每次客户端请求都会携带cookie去访问服务器,这时服务器就会拿出session中的内容和携带过来的cookie进行比较。

   缺点:服务器需要保存大量数据,给存储增加压力。服务端保存用户状态,很难水平扩展。客户端请求依赖服务器,多次请求必须访问同一台服务器(假设集群,就需要各个服务器之间共享数据),有状态登录的方式难以共享session,所以采用单点登录的方式。

请多指教,有啥新理解持续更新!

免责声明:文章转载自《Token之关于基础概念(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据库中的连接Log4j2中RollingFile的文件滚动更新机制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

苹果APNs’ device token特性和过期更新

APNs全名是Apple Push Notification Service。用iPhone的应该都习惯了,每次安装完一个新应用启动后,几乎都会弹出个警告框,“XXX应用”想要给您发送推送通知。这个警告框的权限申请就是为了APNs推送,用户授权后,应用提供商就可以通过APNs给用户推送消息。APNs的工作机制简单来说可以分为两步,第一步是注册推送服务从AP...

sqlplus 汉字乱码问题的解决

从数据库中导一个数据的时候出现了一个很奇怪的问题,中文乱码。首先可以确认的一点,数据在数据库中是以中文存在的,还有就是用Toad进行连接查询的时候也是中文。但是在服务器端直接用sqlplus 连接查询之后,所有中文都显示为乱码。第一反应是字符集的问题,也尝试用修改字符集来解决问题,最终问题还是出在系统的环境变量上。 关于数据库字符集的问题,参考我的bl...

Eclipse利用Maven快速上手搭建MyBatis

一、what is maven? Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多...

tomcat启动报错 ERROR o.a.catalina.session.StandardManager 182

系统:centos6.5 x86_64 jdk: 1.8.0_102 tomcat:8.0.37 tomcat 启动报错: ERROR o.a.catalina.session.StandardManager 182 - Exception loading sessions from persistent storage 网络上的解决方案:    (1)...

【JavaEE】SSH+Spring Security+Spring oauth2整合及example

现在加最后一样,就是oauth2,现在很多网站都有对应的移动版本,那么移动端访问服务端的服务怎么控制权限,我知道的主要是两种方法,第一是模拟浏览器,访问服务的时候会生成session,之后在移动端缓存cookie,每次网络请求都把cookie加上,还有一种就是通过oauth2,登录之后生成一个凭证,每次请求时携带凭证,当然oauth2更多的是为第三方应用提...

MapGuide应用开发系列(11)创建自己的第一个MapGuide应用程序

我们在前面的文章中已经讲到了如何使用MapGuide Studio组织地图、网页布局等,也运行了下载的第一个例子程序,那么如何开发自己的MapGuide应用程序呢?都有那些步骤呢?这篇文章中峻祁连就要讲一下在基于MapGuide开发时,应该遵照的基本步骤。我们以.net 开发为例,如果你采用java或者php,过程是类似的。 基于MapGuide开发WebG...