© 2020, Developed by Hieu Dev

Tại sao cần phải nắm được JWT?

Khi làm việc với api, kiểu gì bạn cũng hốt hoảng để kiếm tìm tài liệu, sao cho viết được con JWT này. Nó thật sự rất cần thiết và áp dụng rất nhiều, để giải quyết hàng loạt các bài toán định dạng trong microservice.


JSON Web Token là gì?

Jwt được viết tắt từ JSON Web Token, nó chính là một JSON đã encrypt, hay còn gọi là token, và nó sẽ chứa các thông tin để backend giải quyết các bài toán về định danh, xác định quyền.


Để hiểu rõ hơn, ta có ví dụ về Token dưới đây:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjEzODY4OTkxMzEsImlzcyI6ImppcmE6MTU0ODk1OTUiLCJxc2giOiI4MDYzZmY0Y2ExZTQxZGY3YmM5MGM4YWI2ZDBmNjIwN2Q0OTFjZjZkYWQ3YzY2ZWE3OTdiNDYxNGI3MTkyMmU5IiwiaWF0IjoxMzg2ODk4OTUxfQ.uKqU9dTB6gKwG6jQCuXYAiMNdfNRw98Hw_IWuA5MaMo

Hoặc nó có thể dài hoặc ngắn hơn, theo code bạn define ở backend. Có thể nó thật sự rất phức tạp, nhưng nếu bạn để ý kĩ, thì trên đoạn token trên sẽ có 3 phần, mà mỗi phần phân cách nhau bởi dấu chấm, và cấu trúc của JWT chỉ đơn giản như sau:
<base64-encoded header>.<base64-encoded payload>.<base64-encoded signature>

Tổng kết lại thì ta thấy được JWT được kết hợp bởi dấu chấm, và mỗi phần sẽ được định dạng ở encode base64, và chúng ta sẽ có ba object chính, đó là header, payload, signature. Cụ thể như sau:
  • Header: Đây là nơi chứa cái thông tin mà được dùng để trả lời cho câu hỏi: “Mã JWT được tính toán như thế nào? Thường thì các thuật toán được dùng để mã hóa là HMAC SHA256 - HS256 hoặc RSA.
  • Payload: Đây là nơi chứa những dữ liệu mà chúng ta muốn lưu lại trong JWT.
  • Signature: 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.

Khi nào thì sử dụng JWT?

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

Authentication: Tình huống thường gặp nhất, khi user logged in, mỗi request tiếp đó đề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 đó.

Trao đổi thông tin: 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 public / private key). 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ị decode, do vậy, bạn không nên dùng JWT để transfer các thông tin nhạy cảm.

Đố chú hack được site anh!

Cái mà ta cần quan tâm ở đây là độ bảo mật khi sử dụng nó. Với signing JWTs đã nhằm mục đích ngăn chặn sự giả mạo ở phía máy khách, nhưng chúng cũng có thể được mã hóa để đảm bảo rằng token rằng mã thông báo mang rất an toàn.

Hiện nay JWT chủ yếu được lưu trữ trực tiếp trong bộ lưu trữ web (local/session storage) hoặc ở cookies. Nói chung, giống như việc sử dụng Cookied-based authentication, việc bạn để mất token (JWT hay SessionID) vào tay người khác cũng đồng nghĩa với việc trao quyền truy cập cho họ.

Giống như việc bạn mang chìa khóa nhà mình đi đánh mới cho người khác. Việc của bạn lúc này là phải thay ngay cái ổ khóa mới mà thôi, nghĩa là làm cho cái khóa đang mở được cửa nhà bạn trở nên vô nghĩa. Với JWT, điều này có thể được hạn chế bằng việc rút ngắn thời gian valid (giảm expiration date) để tăng cường độ thay đổi JWT của bạn (giống như việc bạn thay đổi ổ khóa)

Chú ý rằng: Để ngăn chặn việc bị đánh cắp token, sử dụng HTTPS/SSL để đảm bảo rằng Cookies và JWTs luôn được encrypted trong quá trình trao đổi client-sever. (Ví dụ như ngăn ai đó dùng Wireshark theo đổi request đọc request của bạn)

Lời kết

Một chuỗi Token khi sinh ra không thể tồn tại mãi được vì như vậy nếu sau này hacker lấy được chuỗi Token thì sẽ lấy được tất cả quyền truy cập của bạn , cho nên chúng ta phải thiết lập thêm phương thức hủy Token đi và Create Token mới khi người dùng đăng nhập lần sau. 

Thường thì một Token nên có thời hạn từ 10 đến 30 ngày hoặc khi người dùng Logout thì Token sẽ bị hủy ngay. Như các bạn thấy nếu bên Website thì Token này sẽ được lưu vào file Cookie của trình duyệt, nếu bạn xóa đi Cookie thì tất cả các tài khoản mà bạn đăng nhập lần trước sẽ không được lưu lại nữa và bạn phải nhập lại mật khẩu và nhận được một Token mới.

By Hiếu Quốc.

Đăng nhận xét

Mới hơn Cũ hơn