Get in touch
or send us a question?
CONTACT

JSON Web Key (JWK)

Một JSON Web Key (JWK) là cấu trúc dữ liệu JSON (JavaScript Object Notation) đại diện cho một khóa mật mã.
Đặc tả trên cũng định nghĩa cấu trúc dữ liệu JWKS (JSON Web Key Set đại diện cho một tập hợp các JWK).
JWK được sử dụng để xác minh chữ ký web – JSON Web Signature (JWS) và Mã hóa dữ liệu web – JSON Web Encryption (JWE).

Tính ứng dụng
Ý tưởng như sau, Chúng ta có 1 hệ thống gồm 2 microserver và 1 Client.
– Microserver 1 là dịch vụ Authorization, Sau khi auth sẽ được cung cấp 1 mã JWT (JSON Web Token) dùng để định danh.
– Microserver 2 là dịch vụ lưu trữ và cung cấp dữ liệu, yêu cầu xác thực JWT và định danh người dùng trước khi thực hiện lưu trữ hoặc cung cấp dữ liệu.
– Client có nhiệm vụ đăng nhập và lấy mã JWT từ Microserver 1, gửi yêu cầu truy vấn dữ liệu từ microserver 2 và hiển thị ra cho người dùng.
Vậy làm sao để đảm bảo tính bảo mật, toàn vẹn dữ liệu cũng như chia sẻ tài nguyên giữ các hệ thống trên.

Sử dụng JWKS để xác minh JWT/JWS.

Lúc này chúng ta sẽ sử dụng thuật toán RS256 để tạo ra 1 cặp khóa Public/Private key.

Microserver 1:
– Tạo 1 endpoint trả về 1 JWKS có cấu trúc

{
  "keys":[
    {
      "kty": "RSA",  // Loại khóa, chẳng hạn như 'RSA' hoặc 'EC'.
      "alg": "RS256", // Thuật toán dùng trong JWS/JWT ở đây là RS256
      "kid": "dbd58951dc3a49ebb5811a7b79151495",  // ID của khóa, được thêm vào phần Header của JWT
      "n": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyqIylhcucTqmFvx9Nd83AewOXbnpmZDza+pxf0soumuwDAtD+wu5ya7HWJlM9MdhLFX/TFiokMjUj9lWw+UjJ8y2kn+QOEcfsarVgcx9N65+zzKGMOfwDZTahHUAJMlag1UXC4ndigQitBTfzLq4JfJWli2xUz2cD1w1GStGOdQIDAQAB", // Public key được sử dụng xác minh JWS
    }
  ]
}

– Tao 1 endpoint trả về JWT gồm 3 thành phần:
* Header

{
  "typ": "JWT",
  "alg" : "RS256",
  "kid" : "dbd58951dc3a49ebb5811a7b79151495",
}

* Payload

{
  "iss": "Neos Vietnam International Co., Ltd.", // tổ chức phát hành token (không bắt buộc)
  "aud": "https://neoscorp.vn/", // đối tượng sử dụng token (không bắt buộc)
  "uid": "123456789", // user id định danh người dùng
  "exp": 1558065420 // thời điểm token sẽ hết hạn (không bắt buộc)
}

* Signature (JWS)

Phần chữ ký được tạo bằng cách kết hợp 2 phần Header + Payload, rồi mã hóa nó lại bằng Private key (JWS)
Mã hóa base64url Header, Payload rồi nối 3 thành phần lại ta được JWT

Client:
– Gửi Request auth lên Microserver 1 và nhận về JWT.
– Gửi request lên Microserver 2 lấy dữ liệu về.

Microserver 2:
– Nhận request từ Client.
– Gửi request lên Microserver 1 và nhận về JWK.
– Sử dụng JWK Verify Signature và Verify Permissions.
– Trả lại kết quả cho Client.