So sánh JSON Web Token(JWT) và Session Cookies trong việc Authentication

Xin chào tất cả các bạn. Tuần trước mấy anh em trong công ty nhân buổi chiều rảnh rỗi cũng có ngồi bàn luận với nhau về JWT. Có lẽ vì đa phần anh em cũng chưa từng làm việc qua với JWT hoặc đã từng làm việc nhưng thường dùng package nên về bản chất, cơ chế hoạt động, lý do dùng,… mọi người vẫn chưa thật sự hiểu rõ.

Chính vì vậy nhân một ngày đẹp trời mình quyết định vác sách bút đi tầm sư học đạo, đi muôn nơi thỉnh kinh. Lần ra đi này mình vô cùng quyết tâm với lời thề nếu không hiểu được JWT quyết sẽ không trở về. Mọi người cùng đón xem hành trình của mình nhé.

Chuẩn bị đi thỉnh kinh

Để chuyến đi thỉnh kinh được diễn ra suôn sẻ thì mình xin phép làm rõ một và vấn đề như sau nhé.

Chắc các bạn cũng biết rằng HTTP là một chiếc cầu nối giữa client và server (giao thức truyền tải). Và nó là một giao thức stateless (stateless protocol).

Vậy stateless là gì nhể? Giải thích một cách dễ hiểu thì một giao thức stateless là giao thức mà sau khi client gửi dữ liệu lên server, server thực thi xong, trả kết quả lại về cho client thì “quan hệ” giữa client và server bị “cắt đứt”, server không lưu lại bất cứ dữ liệu trạng thái gì của client.

Trong cuộc đời nào được như ý muốn
Nhiều lúc yêu thương đã không trọn vẹn
Nên chấp nhận cuộc tình chia hai lối
Còn níu kéo cũng chẳng để làm chi

Để giải thích bằng ví dụ thì điều này có nghĩa là nếu như chúng ta đăng nhập vào tài khoản Facebook. Sau đó chúng ta di chuyển sang trang Settings thì chúng ta sẽ phải đăng nhập lại vì server không giữ trạng thái của chúng ta. Tuy vậy bài toán này đã được giải quyết với session và cookies. Bằng cách lưu giữ thông tin tại 2 phía client và server thông qua session và cookies mà server có thể biết được client này đã đăng nhập được hay chưa.

Ngoài Session và Cookies ra thì vẫn còn 1 vài kỹ thuật nữa được sử để xác thực đăng nhập (authentication). Trong đó có JWT.

JWT là gì?

JWT là viết tắt của JSON Web Token – một tiêu chuẩn mở (RFC 7519) cho việc bảo việc trong truyền tải dữ liệu giữa các endpoint.

JSON Web Token bao gồm 3 phần, được ngăn cách nhau bởi dấu chấm (.), đó là:

  1. Header
  2. Payload
  3. Signature

Header

Gồm 2 phần, đầu tiên là loại token (ở đây là JWT) và phần tiếp theo là loại thuật toán sử dụng để mã hóa ví dụ như HMAC SHA256 hay RSA. Nếu không định nghĩa thì mặc định sẽ sử dụng thuật toán mã hóa HS256.

{
    "typ": "JWT",
    "alg": "HS256"
}

Payload

Payload sẽ chứa các thông tin cơ bản của user cần xác thực. Ví dụ như: tên, tuổi, permissions,…

Có 2 lưu ý khi định nghĩa payload đó là:

  • Không cho password, thông tin cần bảo mật vào payload có thể bị decode
  • Không cho quá nhiều thông tin vào payload vì sẽ tạo ra độ trễ cho server

Ví dụ:

{
  "user_name": "vantien",
  "user_id": "1",
  "role": "ADMIN",
}

Signature

Phần cuối cùng là chữ ký, nó được tạo ra bằng cách kết hợp và mã hóa 4 thứ sau:

  1. header
  2. payload
  3. Chuỗi khóa bí mật (secret key)
  4. Thuật toán mã hóa

Ví dụ như sau:

HS256(
    base64UrlEncode(header) +
    “.” +
    base64UrlEncode(payload),
    secret_key
)

Cuối cùng

Sau khi kết hợp 3 phần header, payload và signature chúng ta sẽ có một chuỗi JWT hoàn chỉnh.

Cơ chế xác thực đăng nhập bằng Session và Cookies (Session-Based Authentication)

Với cơ chế này thì sau khi đăng nhập, server sẽ tạo ra session cho user và lưu vào đâu đó (có thể là file, memory, database,…). Sau đó một session ID sẽ được lưu vào trong cookies của trình duyệt. Trong khi user truy cập vào website thì session ID đó sẽ được trình duyệt lấy ra và gửi kèm theo trong request. Nhờ vậy mà server có thể tham chiếu đến session đã lưu trên server để biết user này đã đăng nhập hay chưa. Sau khi user log-out (đăng xuất) thì session sẽ bị xóa đi.

Vậy Cookies là gì? Các bạn hãy đọc bài viết này của mình nhé: Bạn đã hiểu rõ về HTTP Cookie?

Cơ chế xác thực đăng nhập bằng Token – (Token-Based Authentication)

Khi nhắc đến cơ chế xác thực đăng nhập bằng Token (Token-Based Authentication) thì đa phần người ta thường nhắc đến JWT. Trước đây thì các trang web chỉ sử dụng cơ chế Session và Cookies tuy vậy hiện nay cơ chế sử dụng Token vô cùng phổ biến và dần trở thành một tiêu chuẩn cho việc xác thực đăng nhập.

Cơ chế của JWT là như thế nào? Khi user đăng nhập thì server sẽ tạo ra một đoạn token được mã hóa và gửi lại nó cho client. Khi nhận được token này thì client sẽ lưu trữ vào bộ nhớ (thường sẽ là local storage). Sau đó mỗi khi client request lên server thì sẽ gửi kèm theo token. Từ token này server sẽ biết được user này là ai.

Nên dùng cách nào?

Xác thực bằng JWT là phương pháp được mà mình nghĩ sẽ trở thành 1 tiêu chuẩn trong tương lai để dần thay thế cho Session, Cookies khi mà SPA đang trở thành xu thế. Ngoài ra nó có thể scale tốt hơn so với Session Cookies vì token sẽ được lưu trữ ở phía client trong khi Session thì phải lưu ở máy chủ và đây có thể là vấn đề khi một số lượng lớn người dùng sử dụng hệ thống cùng một lúc.

Tuy nhiên, một nhược điểm với JWT là có kích thước lớn hơn nhiều so với session ID vì JWT chứa nhiều thông tin người dùng hơn. Ngoài ra chúng ta cần phải cần thận trong việc cho thông tin người dùng vào JWT vì nó có thể bị decode.

Nếu bài viết có gì sai xót hoặc bạn có điều gì thắc mắc vui lòng để lại comment bên dưới nhé. Cảm ơn bạn đã đọc bài viết này!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *