Bảo mật với JSON Web Token

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu restful api và ứng dụng xây dựng hệ thống TOPUP (Trang 27 - 29)

CHƢƠNG 2 : BẢO MẬT VỚI DỊCH VỤ WEB KIỂU REST

2.5 Kết un

2.5.1 Bảo mật với JSON Web Token

JSON Web Token (JWT) là một chuẩn mở (RFC 7519) định nghĩa một cách cô đọng (compact) và tự chứa (self-contained) để truyền thông tin an toàn giữa các bên như một đối tượng JSON. Thông tin này được xác minh và đáng tin cậy bởi chữ ký số. JWT được ký bằng cách bảo mật ( với các thuật toán HMAC) hoặc một cặp khóa công khai và khóa riêng sử dụng RSA.

Một số khái niệm trong định nghĩa:

Cô đọng (Compact): Bởi vì có kích thước nhỏ gọn, JWTs có thể được gửi thông qua một URL, tham số POST hoặc bên trong tiêu đề HTTP. Ngoài ra, kích thước nhỏ giúp cho việc truyền tải thông tin nhanh.

Tự chứa (Self-contained): Phần tải dữ liệu chứa tất cả thông tin cần thiết về người dùng, tránh việc phải truy vấn cơ sở dữ liệu nhiều hơn một lần.

Một trong những tình huống ứng dụng JWT thường gặp, đó là:

Xác thực (Authentication): Tình huống thường gặp nhất, khi NSD đăng nhập, mỗi yêu cầu tiếp theo đều kèm theo chuỗi token JWT, cho phép người dùng có thể truy cập đường dẫn, dịch vụ và tài nguyên được phép ứng với token đó. Đăng nhập một lần (Single Sign On) cũng là một chức năng có sử dụng JWT một cách rộng rãi, bởi vì chuỗi JWT có kích thước đủ nhỏ để đính kèm trong yêu cầu và sử dụng ở nhiều hệ thống khác nhau.

Trao đổi thông tin (Information Exchange): JSON Web Token cũng là một cách hữu hiệu và bảo mật để trao đổi thông tin giữa nhiều ứng dụng, bởi vì JWT phải được ký (bằng cặp khóa công khai và khóa riêng). Ngoài ra, chữ ký cũng được tính toán dựa trên nội dung của header và nội dung payload, nhờ đó, bạn có thể xác thực được nội dung là nguyên bản, chưa được chỉnh sửa hoặc can thiệp. Tuy nhiên, một lưu ý hết sức quan trọng là do cấu trúc của JWT đơn giản nên JWT có thể dễ dàng bị giải mã, do vậy, không nên dùng JWT để truyền các thông tin nhạy cảm.

Cấu trúc của JSON Web Token:

JWT bao gồm ba phần phân cách bởi dấu chấm (.) gồm: - Header

- Payload (Phần tải dữ liệu) - Signature (Chữ ký số)

Header

Header bao gồm hai phần chính: loại token (mặc định là JWT - Thông tin này cho biết đây là một Token JWT) và thuật toán đã dùng để mã hóa (HMAC SHA256 - HS256 hoặc RSA). Ví dụ: { "alg": " SHA256", "typ": "JWT" } Payload

Payload chứa các claims. Claims là một biểu thức về một thực thể (chẳng hạn user) và một số metadata phụ trợ. Có 3 loại claims thường gặp trong Payload: reserved, public và private claims.

(issuer), iat (issued-at time) exp (expiration time), sub (subject), aud (audience), và các thông tin khác. Ví dụ: { "iss": "scotch.io", "exp": 1300819380, "name": "Chris Sevilleja", "admin": true

}

Public Claims - Claims được cộng đồng công nhận và sử dụng rộng rãi.

Private Claims - Claims tự định nghĩa (không được trùng với Reserved Claims và Public Claims), được tạo ra để chia sẻ thông tin giữa 2 bên đã thỏa thuận và thống nhất trước đó.

Signature

Chữ ký (Signature) trong JWT là một chuỗi được mã hóa theo nguyên tắc sau: HMACSHA256(

base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

Do bản thân Signature đã bao gồm cả header và payload nên Signature có thể dùng để kiểm tra tính toàn vẹn của dữ liệu khi truyền tải.

Cấu trúc một JWT

Mỗi JWT là sự kết hợp bởi dấu (.) một đối tượng Header dưới định dạng JSON được mã hóa base64, một đối tượng payload dưới định dạng JSON được mã hóa base64 và một Signature cho URI cũng được mã hóa base64.

<base64-encoded header>.<base64-encoded payload>.<base64-encoded signature> Ví dụ về một JWT: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjEzODY4OTkxMzEsImlzcyI 6ImppcmE6MTU0ODk1OTUiLCJxc2giOiI4MDYzZmY0Y2ExZTQxZGY3YmM5M GM4YWI2ZDBmNjIwN2Q0OTFjZjZkYWQ3YzY2ZWE3OTdiNDYxNGI3MTkyM mU5IiwiaWF0IjoxMzg2ODk4OTUxfQ.uKqU9dTB6gKwG6jQCuXYAiMNdfNRw98 Hw_IWuA5MaMo”

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu restful api và ứng dụng xây dựng hệ thống TOPUP (Trang 27 - 29)