HTTP协议是无状态的,每次HTTP请求响应后,就会断开此次链接。若是客户端再次发送请求,服务端也不能识别出这个客户端是否是上次请求过的客户端,HTTP协议不能进行会话跟踪。而Cookie,Session,Token正是为了解决HTTP协议无状态问题。html
Cookie机制是在客户端实现,采用客户端保持状态的方案。
Cookie由服务端生成,发送给客户端(Set-Cookie),客户端请求的时候会带上这个Cookie。
请求流程: git
上图中logged_in
和user_session
两个Cookie值表示登陆github.com后保存下来的登陆状态和Session。github
Session是在服务端实现,当客户端请求服务端时,服务端会检查请求中是否包含Session标识(Session id),跨域
Token也称做令牌,由uid+time+sign[+固定参数]组成:浏览器
如下几点特性会让你在程序中使用基于Token的身份验证:安全
Token是有客户端来保存,用户的状态在服务端的内存中是不存储的,因此这是一种无状态的认证机制。而认证的具体流程以下:服务器
客户端使用用户名跟密码请求登陆 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端 客户端收到 Token 之后能够把它存储起来,好比放在 Cookie 里或者 Local Storage 里 客户端每次向服务端请求资源的时候须要带着服务端签发的 Token 服务端收到请求,而后去验证客户端请求里面带着的 Token,若是验证成功,就向客户端返回请求的数据cookie
这是Token的一种应用场景,使用OAuth实现。 OAuth(开放受权)是一个开放标准,容许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth容许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。
咱们看下github的受权流程: session
维度 | Cookie | Sesson |
---|---|---|
存放位置 | 客户端 | 服务端 |
存取方式 | 只能保管ASCII字符串 | 任何类型的数据 |
安全性 | 对客户端是可见的, 客户端的一些程序可能会窥探、 复制以致修正Cookie中的内容 |
对客户端是透明的, 不存在敏感信息泄露的风险 |
有效期 | 能够保持很长时间不过时 | 依赖于JSESSIONID的Cookie, 默许过时时间为–1, 只需关闭了浏览器,该Session就会失效 |
跨域支持 | 支持跨域名访问 | 仅在它所在的域名内有效 |
做为身份认证Token安全性比Session好。
Session是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。
Token,若是指的是OAuth Token 或相似的机制的话,提供的是认证
和受权
,认证是针对用户,受权是针对App。