cookie 与 session
什么是cookie
- Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key,value保存到某个目录下的文本文件内,下次请求同一网站时自动发送该Cookie给服务器
- Cookie可以用来在某个WEB站点会话间持久的保持状态
示例:
由于hTTP是一种无状态的协议,服务器单从网络连接上无法记录和判断多次访问的用户状态
- 就好比你开了个奶茶店重,有顾客买了个奶茶走了,下一次再来买,你怎么有这个信客理你的老顾客,好好招待他呢?
- 解决办法很简单,就是办个会员卡卡上记录着她的余额等信息,这个会员卡好比是Cookie, 当顾客拿着这张会员卡下次再进店购买时,就可以证明他是个老顾客
- 但是这里也暴露出来了一个问题,给顾客会员卡,顾客可以直接在他手里修改,或者被人盗用模仿,好比就像是Cookie放入客户端浏览器
总结:
- 由于Cookie是放入了客户端浏览器,客户端可以有机会和权限修改Cokie, 或者被别人模仿伪造盗用,所以Cookie不安全。
什么是session
- session是另一种记录客户状态的机制,基于cookie实现,不同的cookie保存在客户端浏览器中,而Session保存在服务器上。
- 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session,客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
示例:
- 在上面,我们开了奶茶店通过办卡的形式来给用户维持状态,问题很明显,存储在客户端的会员卡Cookie,安全性极低,很容易被客户端修改
- 比如卡上直接写着你的余额,那客户端自己就可以修改,那奶茶店就会赔本儿了
- 那现在解决这个问题很简单,那就是把核心数据不放在卡上,但是为了维持状态,卡依旧还是要给的,正如Session基 于Cookie一样,只不过这个卡上只有一串随机生成的唯一数字代表会员卡号,不存储其他有价值的数据,这就像是Session实现时还是要在Cookie里存放 一个sessionID在cookie里。
- 这个会员卡号数字每个用户都不一样,通过这个卡号可以对应数据库里的一条数据,数据中有这个用户实际的金额等等有价值的数据,这样就保证了用户拿着卡,能访问钱,但是她改不了钱数,避免了Cookie被篡改的问题。
总结:
session相对于cookie较安全,但是Session也存在盗用的问题,别人可以复制这个卡号消费你的钱,可以复制在Cookie里存的SessionID伪装成你。
如何解决session,cookie盗用问题
由于Session和Cookie都涉及到了在客户端存储信息,所以盗用是不可避免的,包括JWT也是在客户端Storage里存储,这也可能被盗用
所以目前的解决办法是尽量的把Cookie或者Session或者JWT的有效期设置的短一些。
session与cookie的区别
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie 同 时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session