说到系统的安全识别,记得自己第一个项目,用的就是session,用户登录进来以后,给他session标记登录,记录id进去,轻轻松松,设计的操作也很简单,类似操作HashMap。
这大概也有1年多快两年了,现在回头看真的是可怕,几乎在裸奔
众所周知,平常使用的Session是存储在服务器的一种技术,可以理解为一个会话id,每次使用HTTP请求,都会携带一个sessionId,服务器根据这个SessionId去找对应的session
しかし,我预判了你的预判
第三方完全可以随便输入一个sessionId,就能破了简单session记录登录的模式了,要想保住自己的大宝贝,必须使用安全加密的功能
关于session安全性文章,搜一下csdn,很多的
Session安全性
除此之外,session因为是服务器记录登录状态,无疑也给服务器增加了压力,那么下面就是JWT(或者叫Token)发光发热的舞台了!
只是为了构建JWT请快步到相应的位置
JWT的全称JSON Web Token
这里我先简单说一下JWT是个啥东西,然后分析为什么好用
JWT可以看做一个身份证,
众所周知,身份证有这几个特性:
事实上,这几乎就是JWT了
JWT的特性完全相同,甚至可以用理解身份证的角度来理解他
咳咳,不搞hs,回到正轨,通过我们一本正经的分析,
我们不难发现:Token可以做到在你脸前裸奔,但你却无可奈何
盘点主要特性:
其中第一点很重要,token里面的信息是公开的,所以别放密码
@某大学某实验室的某学弟
JWT通常情况下是三段,但是也存在一些丧心病狂的,把token又加密了一遍(内行,我直呼内行)
下面是官方给的一个demo(例子)
这个网站也是可以访问的,可以自己试着玩,也可以用来测试
https://jwt.io/
其中很明显为三个部分:HEADER(头部)、PAYLOAD(数据)、VERIFY SIGNATURE(签名)
其中数据(PAYLOAD)官方定了这几个部分:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
签名(Signature )部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
上面用比较形象的方式描述了JWT,下面用官方的话来总结特点
详细大家都有maven的经验了
实在不会可以去maven仓库把jar包下载
你用你三岁时就买来的键盘,轻松的使用这个jjwt框架,并老老实实的按照我给的流程感♂受
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwtartifactId>
<version>0.9.1version>
dependency>
public static String tokens(Map<String, Object> claims, String secretKey, int millisecond, String jwtIssuer, String jwtAud) {
//获取当前的时间
Calendar calendar = Calendar.getInstance();
Date date = new Date(System.currentTimeMillis());
calendar.setTime(date);
//向后退后秒数
calendar.add(Calendar.MILLISECOND, millisecond);
Date endTime = calendar.getTime();
JwtBuilder builder = Jwts.builder().setClaims(claims)
.signWith(SignatureAlgorithm.HS256, secretKey)
.setClaims(claims)
.setIssuedAt(new Date())
.setExpiration(endTime)
.setIssuer(jwtIssuer)
.setAudience(jwtAud);
return builder.compact();
}
JwtBuilder 是jjwt提供的工具,可以很轻松的构建出一个jwt,利用Builder设计模式,对内容进行定义
其中payload的自定义内容是使用map保存的
public static Claims parse(String jwt, String secretKey) throws JwtExpireException, JwtVerifyException , JwtNotExistException{
Claims claims = null;
try {
claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
} catch (ExpiredJwtException expiredJwtException) {
throw new ExpiredJwtException("token过期");
} catch (JwtException jwtException) {
throw new JwtException("JWT验证错误");
} catch (IllegalArgumentException illegalArgumentException) {
throw new IllegalArgumentException("Token为空");
}
return claims;
}
Claims类就是你的PAYLOAD,可以直接取出信息使用,不抛出异常就视为成功了
一键三连,支持弟弟