Cookie Session 和 Token
所属分类 architecture
浏览量 1530
Cookies 由服务端产生
浏览器第一次访问时,服务器给浏览器创建一个独特的身份标识,放入 Set-Cookie 字段里,随着响应报文发给浏览器。
浏览器 保存cookie,下次请求时会自动发送Cookie
服务端收到请求报文后,发现Cookie 里的身份标识数据,根据此信息提供个性化的服务
HttpServletResponse response
response.addCookie(new Cookie("name","xxx"));
response header
Set-Cookie:name=xxx
浏览器发送cookie
request header
Cookie:name=xxx
Cookie属性
参数名 作用 后端设置方法
Max-Age 设置cookie的过期时间,单位秒 cookie.setMaxAge(10)
Domain 指定了Cookie所属的域名 cookie.setDomain("")
Path 指定了Cookie所属的路径 cookie.setPath("");
HttpOnly 设置Cookie只能靠浏览器Http协议传输,禁止其他方式访问 cookie.setHttpOnly(true)
Secure 设置Cookie只能在Https安全协议中传输 cookie.setSecure(true)
cookie.setPath("/xxx")
http://localhost:8080/xxx 带上cookie
http://localhost:8080/ 不带cookie
Session 存在服务端,客户端只存储SessionId
HttpSession session
session.setAttribute("name","tiger");
Object name = session.getAttribute("name");
Set-Cookie:JSESSIONID=xxxxx;Path=/;HttpOnly
Tomcat Session 管理
org.apache.catalina.session.ManagerBase
protected Map< String, Session> sessions = new ConcurrentHashMap< >();
public Session createSession(String sessionId)
StandardSession
session.setId(id); 把 id 放到 sessions 里
public void setId(String id, boolean notify) {
if ((this.id != null) && (manager != null))
manager.remove(this);
this.id = id;
if (manager != null)
manager.add(this);
if (notify) {
tellNew();
}
}
ManagerBase
public void add(Session session) {
sessions.put(session.getIdInternal(), session);
int size = getActiveSessions();
if( size > maxActive ) {
synchronized(maxActiveUpdateLock) {
if( size > maxActive ) {
maxActive = size;
}
}
}
}
分布式session redis
Token
JWT(Json Web Token)
Token的优点
不需要在服务端保存会话信息,特别适用于分布式微服务
简洁:可以通过URL,POST参数或者是在HTTP头参数发送,数据量小,传输速度快
自包含:token包含了用户信息,避免多次查询数据库
Token以Json格式保存在客户端,跨语言
JWT 用.分割成三部分
Header Payload Signature
Header
元数据
{
"alg": "HS256",
"typ": "JWT"
}
alg 签名算法(algorithm),默认 HMAC SHA256(HS256)
typ 令牌类型(token type),JWT 令牌 JWT
token 通过url传递 , 使用 Base64URL 编码
Base64和Base64URL
Base64UrlCodec
Payload
存放实际数据
官方可选字段
iss (issuer) 签发人
exp (expiration time) 过期时间
sub (subject) 主题
aud (audience) 受众
nbf (Not Before) 生效时间
iat (Issued At) 签发时间
jti (JWT ID) 编号
自定义字段
{
"name": "dyyx",
"age": 30
}
JWT 默认不加密
Signature
对前面两部分数据签名,防止数据篡改
秘钥 不能泄露
使用Header中指定的签名算法
eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiZHl5eCIsImFnZSI6MzB9.fZjp6dlmO0n3GwFVY5oiSPJ_cnHqN2varZLZ8aYXEEw
header={alg=HS256},body={name=dyyx, age=30},signature=fZjp6dlmO0n3GwFVY5oiSPJ_cnHqN2varZLZ8aYXEEw
io.jsonwebtoken:jjwt:0.9.0
完整代码
https://gitee.com/dyyx/xdemo/blob/master/src/main/java/dyyx/jwt/JwtTest.java
上一篇
下一篇
map computeIfAbsent 方法使用
微服务架构优雅停机
基本的社交礼仪
Timer already cancelled 异常分析
drools简介及实例
redis单线程为什么还那么快