答: 是由于网络中 http 协议造成的, 因为 http 本身是无状态协议, 这样, 无法确定你的本次请求和上次请求是不是你发送的. 如果要进行类似论坛登陆相关的操作, 就实现不了了.
2. session 生成方式?
答: 浏览器第一次访问服务器, 服务器会创建一个 session, 然后同时为该 session 生成一个唯一的会话的 key, 也就是 sessionid, 然后, 将 sessionid 及对应的 session 分别作为 key 和 value 保存到缓存中, 也可以持久化到数据库中, 然后服务器再把 sessionid, 以 cookie 的形式发送给客户端. 这样浏览器下次再访问时, 会直接带着 cookie 中的 sessionid. 然后服务器根据 sessionid 找到对应的 session 进行匹配;
还有一种是浏览器禁用了 cookie 或不支持 cookie, 这种可以通过 URL 重写的方式发到服务器;
简单来讲, 用户访问的时候说他自己是张三, 他骗你怎么办? 那就在服务器端保存张三的信息, 给他一个 id, 让他下次用 id 访问.
3. 为什么会有 token 的出现?
答: 首先, session 的存储是需要空间的, 其次, session 的传递一般都是通过 cookie 来传递的, 或者 url 重写的方式; 而 token 在服务器是可以不需要存储用户的信息的, 而 token 的传递方式也不限于 cookie 传递, 当然, token 也是可以保存起来的;
4. token 的生成方式?
答: 浏览器第一次访问服务器, 根据传过来的唯一标识 userId, 服务端会通过一些算法, 如常用的 HMAC-SHA256 算法, 然后加一个密钥, 生成一个 token, 然后通过 BASE64 编码一下之后将这个 token 发送给客户端; 客户端将 token 保存起来, 下次请求时, 带着 token, 服务器收到请求后, 然后会用相同的算法和密钥去验证 token, 如果通过, 执行业务操作, 不通过, 返回不通过信息;
5. token 和 session 的区别?
token 和 session 其实都是为了身份验证, session 一般翻译为会话, 而 token 更多的时候是翻译为令牌;
session 服务器会保存一份, 可能保存到缓存, 文件, 数据库; 同样, session 和 token 都是有过期时间一说, 都需要去管理过期时间;
其实 token 与 session 的问题是一种时间与空间的博弈问题, session 是空间换时间, 而 token 是时间换空间. 两者的选择要看具体情况而定.
虽然确实都是 "客户端记录, 每次访问携带", 但 token 很容易设计为自包含的, 也就是说, 后端不需要记录什么东西, 每次一个无状态请求, 每次解密验证, 每次当场得出合法 / 非法的结论. 这一切判断依据, 除了固化在 CS 两端的一些逻辑之外, 整个信息是自包含的. 这才是真正的无状态.
而 sessionid , 一般都是一段随机字符串, 需要到后端去检索 id 的有效性. 万一服务器重启导致内存里的 session 没了呢? 万一 Redis 服务器挂了呢?
方案 A : 我发给你一张身份证, 但只是一张写着身份证号码的纸片. 你每次来办事, 我去后台查一下你的 id 是不是有效.
方案 B : 我发给你一张加密的身份证, 以后你只要出示这张卡片, 我就知道你一定是自己人.
就这么个差别.
token 的使用可以参考: JSON web token(JWT)
来源: http://www.bubuko.com/infodetail-3144962.html