面试题--Cookie、Session、Token的区别

本文详细分析了Cookie和Session的区别,包括它们的存储位置、存储容量、安全性、生命周期等,并通过Java代码展示了如何创建和设置Cookie与Session。此外,还探讨了分布式环境下的Session管理和跨域问题,以及Cookie的安全隐患。最后提到了Token作为无状态授权的解决方案,适用于无状态应用和跨端共享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Cookie,Session他们之间的区别?

参考掘金好文

关于cookie和session的分析:

​ 先说说背景,了解什么是cookie和session,为什么需要cookie和session。

​ http是无状态协议,就是说服务端对每一次请求都是无记忆的,因此服务端就不知道,这个请求的用户登录没有?,有没有访问权限?。因此cookie和session就是用来记录用户信息进行会话跟踪,从而让服务端区别是哪个用户发来的请求的。当客户端第一次请求服务端时,服务端就会生成一个cookie和session,将sessio保存在服务器中,将cookie添加到http响应报文中返回给客户端,后续客户端每次对服务端进行请求时都会带上sessionID,服务端通过sessionID区分不同用户发送的请求。

简单理解cookie和session就是两个用于存放用户信息的数据结构,一个保存在客户端,一个保存在服务端。cookie可以由服务端和客户端生成,session只能由客户端生成,两者配合共同完成记录会话信息的功能。

http响应报文的首部行

Set-Cookie = xxxx sessionID + cookie创建信息

两者对比:

回答角度cookiesession
存储位置保存在客户端保存在服务端
存储数据容量<= 4kb无限制,但会占用服务端内存资源,一般不存储太多
存储的时长可以长期保存关闭浏览器超过一定时间(30分钟)就会自动删除
两者的安全性保存在服务端相对更安全,不存在信息泄露风险保存在客户端,cookie可能被窃取导致信息泄露
是否占用服务端资源保存在客户端,不占用服务端资源保存在服务端,占用资源
存储的数据类型只能保存字符串类型任意类型
创建方可以由客户端发起创建,也可以由前端发起创建只能由服务端创建

如何在Java中创建和设置Cookie和Session?

  • 写入cookie --> http响应报文,set-cookie字段写入cookie数据到浏览器
    • 编写一个Controller,加入HttpServletResponse response 参数
    • new 一个Cookie,设置相关属性
    • 将cookie实例添加到response中即可
  • 读取cookie
    • 编写一个Controller,加入HttpServletRequest request 参数
    • 通过 request.getCookies() 获取所有该域名下的cookies
    • 遍历cookies通过比较cookie.getName() 查找到指定cookie
  • 同理,通过request.getSession() 可以获得HttpSession对象。
@GetMapping("/goodsList")
public void getGoodsList(HttpServletRequest request, HttpServletResponse response) {

    Cookie cookie = new Cookie("cookieName","cookieValue");
    cookie.setHttpOnly(true); // 只允许服务端修改
    cookie.setMaxAge(60*10);  // 过期时间一小时
    cookie.setValue("newValue") //重新设置cookei值
    response.addCookie(cookie);
}

@GetMapping("/goodsList")
public void getGoodsList(HttpServletRequest request, HttpServletResponse response) {
    
	//HttpSession session = request.getSession();
    //session.setAttribute("key","value");
    //session.setAttribute("key2","value2");
    Cookie[] cookies = request.getCookies(); // 获取所有cookie
    for (Cookie cookie : cookies) {
        cookie.getName(); // 查找到指定cookie
    }
}

关于cookie和session的补充

  • 做分布式集群需要对session做分布式session共享(存到redis中去),否则会导致在机器A上的session在机器B上失效。
  • 跨域时,当后端项目向浏览器写入cookie时,前端项目协议、域名、端口和后端接口的协议、域名、端口必须相同时才能写到浏览器
  • 浏览器禁用cookie-session机制,手动传递sessionID,URL重写
  • cookie无法跨域共享问题?–》token

参考>>

2. Token是什么?

另一种授权登录方案,主要用于无状态应用,非浏览器应用。。。

  • token是代表用户身份的令牌,通常客户端在登录时就发起申请由服务端进行授权签发,里面存放着一些关于用户的合法信息,用于判断请求是否合法(已登录),哪个用户发送的请求
  • 用户在登录时通过验证后获得由服务端签发的token,由服务端将用户信息加密后写入到token中,因此token中的加密信息都是合法的,可以使用JJWT依赖完成以上操作。
  • 每次请求服务端时,服务端都会对用户携带的token合法性进行验证,有效即可获得token中的信息,进而判断是哪个用户发送的请求。
  • 与浏览器隐私策略无关

核心信息:

  • token由服务端进行签发
  • 服务端可以自由写入数据到token中
  • 可以设置token的过期时间
  • token不依赖于浏览器,可以让一套API跨端共用(用在小程序,安卓应用,IOS,桌面应用)
  • JJWT可选择各种各样的加密算法,例如HS-512等安全的加密算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值