人生有兩個悲劇:第一是想得到的得不到,第二是想得到的得到了
其實token的出現(xiàn)是為了解決sessionId存放的問題
sessionId 在分布式系統(tǒng), 如果你存放在一臺機器, 讓一臺機器服務(wù)負(fù)責(zé)session相關(guān)的存放, 存放單點故障的風(fēng)險, 這是有狀態(tài)的, 那么如果用token進行改進的話, 就可以做到無狀態(tài)了, 但是呢?
給了一個token, 可是服務(wù)器怎么認(rèn)這個token是我頒發(fā)給服務(wù)器的呢?
在安全認(rèn)證領(lǐng)域, 登錄之后通常會給一個token, 方便瀏覽器記住用戶, 數(shù)字簽名 token, 服務(wù)器是怎么認(rèn)出是他授予的簽名, 我介紹一下服務(wù)器是如何認(rèn)出token和jwt是他授予的簽名的
在安全認(rèn)證領(lǐng)域,Token(令牌)是一種常用的認(rèn)證機制。通常,在用戶登錄成功后,服務(wù)器會生成一個Token并返回給瀏覽器。瀏覽器將此Token存儲在本地,并在后續(xù)請求中將其附加到請求頭中。服務(wù)器收到請求后,會驗證Token的有效性并據(jù)此確定用戶身份。JSON Web Token(JWT)是一種常用的Token格式。
服務(wù)器如何認(rèn)出Token和JWT是其授予的簽名:
-
生成Token時,服務(wù)器會使用密鑰(例如:對稱密鑰或非對稱密鑰對)對Token進行加密或簽名。在JWT中,這一過程通常使用HS256、RS256等加密算法完成。
-
服務(wù)器將生成的Token發(fā)送給瀏覽器。瀏覽器在后續(xù)請求中將Token附加到請求頭中。通常,這是通過"Authorization"請求頭實現(xiàn)的,格式為 “Bearer ”。
-
當(dāng)服務(wù)器收到帶有Token的請求時,它會對Token進行驗證。這一過程包括解密(對稱密鑰)或驗證簽名(非對稱密鑰對),并檢查Token中的有效期、頒發(fā)者等信息。
-
如果驗證成功,服務(wù)器會根據(jù)Token中的載荷(Payload)識別出用戶身份,并處理相應(yīng)的請求。否則,服務(wù)器將拒絕該請求,可能返回401未授權(quán)或403禁止訪問等狀態(tài)碼。
在Java中,我們可以使用諸如"java-jwt"、"jjwt"等庫來處理JWT。以下是一個簡單的示例,展示了如何使用"java-jwt"庫生成和驗證JWT:文章來源:http://www.zghlxwxcb.cn/news/detail-405993.html
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
public class JwtDemo {
private static final String SECRET_KEY = "my-secret-key";
public static void main(String[] args) {
// 生成JWT
String token = generateJwt("user-id-123");
// 驗證JWT
try {
DecodedJWT decodedJwt = verifyJwt(token);
System.out.println("User ID: " + decodedJwt.getClaim("userId").asString());
} catch (JWTVerificationException e) {
System.out.println("Invalid JWT!");
}
}
private static String generateJwt(String userId) {
Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
return JWT.create()
.withIssuer("auth0")
.withClaim("userId", userId)
.sign(algorithm);
}
private static DecodedJWT verifyJwt(String token) throws JWTVerificationException {
Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
return JWT.require(algorithm)
.withIssuer("auth0")
.build()
.verify(token);
}
}
在這個例子中,我們使用HMAC256算法和一個對稱密鑰生成和驗證JWT。當(dāng)然,實際應(yīng)用中可以根據(jù)需求選擇其他算法和密鑰類型??傊?,服務(wù)器通過對Token進行解密或驗證簽名來識別出Token文章來源地址http://www.zghlxwxcb.cn/news/detail-405993.html
到了這里,關(guān)于服務(wù)器: 這個 token 是我的嗎? 我不信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!