一、背景说明
在开发登录功能时,难以避免的会面临选择何种会话技术,来对用户的登录状态进行认证和校验。常见的三种方式包括:
- cookie
- session
- JWT令牌
下面依次展开对这三种会话技术的优缺点进行说明。
二、会话技术之 Cookie
1、为什么说cookie是客户端会话技术
cookie是一种客户端会话技术,他是存储在浏览器的,那为什么说他是客户端会话技术呢?可以看以下代码来证明:
private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) { Cookie cookie = new Cookie(key, value); if (domain != null) { cookie.setDomain(domain); } cookie.setPath(path); cookie.setMaxAge(maxAge); cookie.setHttpOnly(isHttpOnly); response.addCookie(cookie);//直接响应给浏览器,没有存储在服务器端 }
他是由服务器端,通过response对象直接响应给浏览器的,并没有存在服务器中。
下图就是服务器响应给客户端浏览器的cookie
2、cookie的优点和缺点
优点
- 他是HTTP协议中支持的技术
- 占用更少的内存,不需要任何服务器资源,并存储在用户的计算机上,因此不会给服务器带来额外的负担。
缺点
- 移动端APP无法使用cookie
- 不安全,用户可以自己禁用浏览器的cookie
- cookie不能跨域
补充说明一下,跨域区分的三个维度:协议、域名/IP、端口
三、会话技术之 Session
1、为什么说Session是服务端会话技术
Session是一种服务端会话技术,他是存储在服务器上的,那为什么说他是服务器会话技术呢?可以看以下代码来证明:
public static String getValue(HttpServletRequest request, String key) { HttpSession session = request.getSession(); session.setAttribute("login",key+"_"+ UUID.randomUUID()); ....... }
当客户端第一次请求服务器的时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象
下图是浏览器请求服务器端接口时,浏览器会把之前服务器端生成的sessionID,通过请求头带给服务器
2、session的优点和缺点
优点
- 存储在服务器端,比较安全
缺点
- 服务器集群环境下无法直接使用session
四、令牌技术JWT
1、JWT 的原理
服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。
{ “姓名”: “张三”, “角色”: “管理员”, “到期时间”: “2018年7月1日0点0分” }
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。
服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。
2、JWT的优点和缺点
优点
- 支持pc端、移动端
- 解决集群环境下的认证问题
- 减去服务器端的存储压力
缺点
- JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
- JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。