Giải mã và xác minh JWT Token trong Java là một kỹ thuật phổ biến trong bảo mật API, giúp ứng dụng đọc dữ liệu và xác minh tính toàn vẹn của Token. Dưới đây là tóm tắt chi tiết và dễ hiểu từ nội dung bạn đã cung cấp:
1. JWT là gì?
JWT (JSON Web Token) bao gồm 3 phần chính:
- Header: Chứa thông tin về thuật toán mã hóa.
- Payload: Chứa dữ liệu người dùng (yêu cầu).
- Signature: Xác minh tính toàn vẹn của dữ liệu.
JWT được biểu diễn dưới dạng chuỗi, mỗi phần được mã hóa Base64 và ngăn cách bởi dấu chấm (.
).
2. Giải mã JWT
Giải mã cho phép đọc thông tin từ header
và payload
. Ví dụ:
String[] chunks = token.split("\\."); // Tách JWT thành các phần
Base64.Decoder decoder = Base64.getUrlDecoder();
// Giải mã header và payload
String header = new String(decoder.decode(chunks[0]));
String payload = new String(decoder.decode(chunks[1]));
System.out.println("Header: " + header);
System.out.println("Payload: " + payload);
Với JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.qH7Zj_m3kY69kxhaQXTa-ivIpytKXXjZc1ZSmapZnGE
Kết quả giải mã:
- Header:
{"alg":"HS256","typ":"JWT"}
- Payload:
{"sub":"1234567890","name":"Baeldung User","iat":1516239022}
3. Xác minh JWT
Xác minh đảm bảo rằng dữ liệu trong header
và payload
không bị thay đổi.
3.1. Thêm thư viện jjwt
Thêm jjwt
vào pom.xml
(nếu dùng Maven):
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
3.2. Xác minh chữ ký
- Lấy thuật toán (
alg
) từ header:
SignatureAlgorithm sa = SignatureAlgorithm.HS256;
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), sa.getJcaName());
- So sánh signature:
String tokenWithoutSignature = chunks[0] + "." + chunks[1];
String signature = chunks[2];
DefaultJwtSignatureValidator validator = new DefaultJwtSignatureValidator(sa, secretKeySpec);
if (!validator.isValid(tokenWithoutSignature, signature)) {
throw new Exception("JWT không hợp lệ!");
}
Trong đó:
tokenWithoutSignature
: Header và Payload.signature
: Phần chữ ký từ JWT.- Trình xác thực sẽ tạo một chữ ký mới và so sánh với chữ ký trong JWT.
4. Lưu ý quan trọng
- JWT không mã hóa dữ liệu, nên thông tin trong header và payload có thể bị đọc bởi bất kỳ ai.
- Chữ ký đảm bảo rằng dữ liệu không bị sửa đổi, nhưng bạn cần khóa bí mật (secretKey) để xác minh.
- Đừng lưu trữ thông tin nhạy cảm trong payload.
5. Kết luận
- Bạn có thể giải mã JWT để đọc thông tin.
- Sử dụng chữ ký và thuật toán phù hợp để đảm bảo tính toàn vẹn của JWT.
- Khi làm việc với JWT, hãy sử dụng thư viện mạnh mẽ như
jjwt
để giảm thiểu lỗi và bảo mật tốt hơn.