[TOC]
## SESSION
> 1. `SESSION` 數據存儲在服務器,當認證用戶增多,會增加服務器開銷
> 2. 可擴展`REDIS`存儲,當認證用戶增多,還是會產生很大的開銷,當然也可使用`REDIS`集群
> 3. `SESSION` 依賴于名為`JSESSIONID`的`Cookie`, 當Cookie禁用時,需要手動傳遞`JSESSIONID`,
> > PHP輸出`session_id()`
> 4. `session.gc_divisor` 與 `session.gc_probability` 合起來定義了在每個會話初始化時啟動 gc(garbage collection 垃圾回收)進程的概率。
> > 此概率用 `gc_probability/gc_divisor` 計算得來。
> > 例如 1/100 意味著在每個請求中有 1% 的概率啟動 gc 進程。`session.gc_divisor` 默認為 100。
> > `session.gc_maxlifetime=30`,`session.gc_divisor=1000`,`session.gc_probability=1`,就表示每一千個用戶調用`session_start()`的時候,就百分百的會執行一次垃圾回收機制,將磁盤上沒用的session文件刪除。
## COOKIE
> 1. `COOKIE`數據存儲在客戶端,
> 2. 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
> 3. 容易被劫持,CSRF問題
## JWT (json web token)
>[warning] JWT 的核心是無狀態、自驗證、無中央服務器,有超時時間等機制,我們所實現的登錄功能,本質上是一個狀態保持的機制,要保持,就會有斷開的需求,JWT 不能實現斷開。
> JWT 的核心應用場景根本不是狀態保持!
> * 當需要令牌加入黑名單時 - 同樣需要保存黑名單令牌 - 也會涉及到并發場景 - 以及續簽等問題 - 維護黑名單的開銷 要比`session`低很多
* Header(頭部)
> ```{"alg": "HS256","typ": "JWT"}```
* Payload(負載)
>```
> iss: jwt簽發者
> sub: jwt所面向的用戶
> aud: 接收jwt的一方
> exp: jwt的過期時間,這個過期時間必須要大于簽發時間
> nbf: 定義在什么時間之前,該jwt都是不可用的.
> iat: jwt的簽發時間
> jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。
> ```
* Signature(簽名)
>```
>HMACSHA256(
> base64UrlEncode(header) + "." +
> base64UrlEncode(payload),
> secret)
>```
### 存在問題
> 1. 無狀態JWT令牌不能無效或更新,并且會根據您存儲它們的位置引入大小問題或安全問題。
> 2. 不應該在JWT的`payload`部分存放敏感信息,因為該部分是客戶端可解密的部分。
> 3. 保護好`secret`私鑰,該私鑰非常重要。
> 4. 如果可以,請使用`https`協議
> 如果您擔心有人攔截您的會話cookie,您應該只使用`TLS` 如果您不使用`TLS`,任何類型的會話實現都是可以截取的,包括JWT。
除非您使用Reddit規模的應用程序,否則沒有理由將JWT令牌用作會話機制,只需使用Session即可。
### 使用JWT時注意事項
> 1. 令牌是短暫的,它們只需要有效幾分鐘,以允許客戶端啟動下載。
> 2. 該令牌只能使用一次,應用程序服務器會為每次下載發出一個新令牌,因此任何一個令牌只用于請求一次文件,然后被丟棄,沒有持久化狀態。
> 3. 應用程序服務器仍使用會話,只是下載服務器使用令牌來授權單個下載,因為它不需要持久狀態。
>> 結合Session和JWT Token是完全合理的。它們各有各的目的,有時你需要兩者。不要給需要持久化、長期保存的數據使用JWT。
- 簡介
- PHP
- 字符串函數
- 數組函數
- 正則
- 加密函數
- 面向對象
- 關鍵字
- 設計模式
- 魔術方法
- 機制擴展
- 會話機制
- PHP框架
- laravel
- 問題
- swoole
- easyswoole
- workerman
- 數據庫
- Sphinx
- MongoDB
- MemCache
- Redis
- 基礎操作
- 數據類型
- 持久化
- 分布式鎖
- 內存模型
- redis高級特性
- MySql
- 基礎操作
- 數據類型
- 數據表引擎
- 鎖機制
- 事務處理
- 存儲過程
- 觸發器
- 索引
- 關聯查詢
- 分析SQL語句-優化查詢
- 分區分表
- 主從復制
- MySql安全性
- 網絡協議
- HTTP
- header詳解
- 狀態碼
- nginx-配置
- 邏輯算法
- 時間和空間復雜度
- 常見算法
- 數據結構
- 核心
- 進程、線程、協程
- 存儲容量-計量單位
- 開發軟件及配置
- 版本控制器
- Git
- Fidder
- Fidder-Android7
- 自動化部署
- Jenkins
- supervisor
- Elasticsearch
- LogStash
- RabbitMQ
- AB測試
- JAVA-JDK
- FileBeat
- PhpStorm
- Composer
- Linux
- API安全
- 高并發及大流量相關概念
- 網站優化
- WEB
- Electron