首页  

Cookie Session 和 Token     所属分类 architecture 浏览量 354
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单线程为什么还那么快