Định nghĩa

JWT là chuỗi ký tự chủ yếu để truyền thông tin một cách an toàn giữa các website hoặc các service dưới dạng đối tượng JSON.

JWT gồm 3 thành phần header, payload và signature, thường được biểu diễn ở dạng

<base64-encoded header>.<base64-encoded payload>.<base64-encoded signature>

Ví dụ

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IkxvbmcifQ.UClLwlmbfCN1hRdbJ8QayGPWN8I3gVey3GE7MEK2vlg

JWT để làm gì

  • Authentication: Người ta thường dùng JWT dành cho stateless authentication, nghĩa là server không lưu trạng thái login hay session của user mà chỉ check JWT hợp lệ là coi như user đã authen thành công. Phương thức authen này được cho là cách đơn giản và dễ triển khai nhất. Tuy nhiên có một nhược điểm là khi 1 mã JWT chưa hết hạn sử dụng, nếu để hacker bắt được mã JWT này thì hacker có toàn quyền sử dụng hệ thống với vai trò như người dùng đang đăng nhập.
Mô tả sử dụng JWT trong authen service
  • Information Exchange: JWT là chuỗi mã hóa có chứa data, vì vậy JWT có thể sử dụng để truyền data giữa các service mà muốn data được mã hóa trên đường truyền. Tuy nhiên case này thường ít được sử dụng hơn.

JWT trong Python

Không gì bằng thực hành. JWT sử dụng được hầu hết trong tất cả các ngôn ngữ lập trình. Ở đây mình sẽ minh họa bằng Python.

Cài đặt PyJWT

$ pip install PyJWT

Open CLI, ở ubuntu 18.04 trở lên đã được cài sẵn python3

$ python3

>>> import jwt
>>> token = jwt.encode({"username": "Long"}, '1234', algorithm='HS256') // mã hóa chuỗi ký tự thành JWT
>>>
>>> token // hiển thị nộ dung token
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IkxvbmcifQ.UClLwlmbfCN1hRdbJ8QayGPWN8I3gVey3GE7MEK2vlg'
>>>
>>> jwt.decode(token, '1234', algorithm='HS256')  // decode chuỗi JWT để lấy data
{'username': 'Long'}

Có thể thấy jwt bao gồm 2 func

  • encode để generate json data ⇒ chuỗi jwt
  • decode để convert từ chuỗi jwt ⇒ json data

trong đó encode và decode đều bao gồm SECRET_KEY (chuỗi string ‘1234’) và SECURITY_ALGORITHM là thuật toán mã hóa (ở đây sử dụng mã hóa HS256). Để có thể decode một JWT thì buộc 2 func phải sử dụng chung SECRET_KEY và SECURITY_ALGORITHM