+11

JWT (JSON Web Token) hay là chứng minh nhân dân?

JWT là CMND - Chứng Minh Nhân Dân

  • Tổng quan nó là vậy. Đơn giản nó là vậy. Thực tế nó là vậy. Khẳng định thì nó cũng là vậy.
  • Video: https://www.youtube.com/watch?v=Ue3XVEPcsK8 cho bạn nào muốn nghe / xem nhé.

Để mà nói về JWT thì có quá nhiều người nói về nó, nhưng để mà bảo nó là CMND / CCCD / Passport thì chắc là chỉ có tôi quá.

Nếu để ý kỹ thì thế này, khi bạn chưa được cấp CMND / CCCD thì bạn đi ngân hàng, có lẽ người ta sẽ không làm thẻ cho bạn đâu nhẩy.

Rồi, vậy cấp cho cái CMND để làm gì, để định danh bạn là ai khi bạn cần giao dịch gì đó.

Thế JWT là cái gì? Tương tự CMND thôi nhá. Cũng là để làm cái chuyện định danh xem bạn là ai trước khi bạn cần giao dịch gì đó.

Ai là người cấp CMND?

Dĩ nhiên là cơ quan có thẩm quyền rồi.

  • Huyện / Tỉnh có quyền đại diện cho nhà nước / bộ công an cấp CMND cho bạn.
  • CCCD thì có thể là bắt buộc phải thông qua Cục quản lý cư trú.

Ai là người cấp JWT

Một đơn vị bất kỳ nào đó mang tên IdP -> Identity Provider là người sẽ cấp JWT

Đặc điểm chung của CMND và JWT là gì?

Thông tin mô tả

  • ID: Số CMND / CCCD (Đối với JWT thì nó là user id hoặc còn gọi là sub / subject
  • Thông tin cá nhân: Họ tên, địa chỉ, ... (Đối với JWT thì có thể là các thông tin thêm như email, tên, ... Cái mà gọi là payload hoặc là thêm nữa thì gọi là claims
  • Con dấu (Đối với JWT thì có thể coi như là phần chữ ký SIGNATURE cho dễ hiểu).

Đơn vị cấp / ngày hết hạn

  • Đơn vị cấp: Công An TP. HCM hoặc Cục Quản lý cư dân, ... (Đối với JWT thì nó là cái mang tên issuer / iss -> Ý nghĩa tương tự.
  • Ngày hến hạn: 01/01/2025 (Đối vớiJWT thì là expiry nhưng cũng là ngày giờ hết hạn thôi)

Đổi / cấp mới

Có khi nào ngân hàng giúp bạn đổi CMND / CCCD khi hết hạn không nhỉ?

  • Khi CMND / CCCD hết hạn sau khoảng 15 năm thì người dân sẽ mang CMND / CCCD cũ đến nơi có thẩm quyền để đổi / cấp mới. (Đối với JWT thì cũng tương tự, nhưng thường được nhắc đến với cái tên refreshToken)
  • Nếu mà lỡ có mất CMND / CCCD thì cũng phải có cách nào đó để bạn chứng minh được bạn là ai. VD: Hộ khẩu / Sổ đỏ / Bằng lái xe / Giấy khai sinh ... (Nó cũng coi như là refreshToken đó.
  • Hãy suy nghĩ về câu hỏi mà tôi đặt ra ở trên bạn sẽ thấy là refreshToken sẽ không để ở resources server mà để ở phía client đó =))

Làm giả

Thằng nồi nào cũng làm giả được hết.

  • Đối với CMND / CCCD thì dễ làm giả hơn vì nó chỉ đơn giản là con dấu nên ai cũng có thể làm giả con dấu, trừ khi có dấu hiệu nào đó để cơ quan có thẩm quyền xác minh con dấu hoặc dấu hiệu nào đó nói rằng CMND / CCCD giả.
  • Đối với JWT thì chỉ cần secret key, cái mà mang đi để generate ra cái token đó verify là sẽ được.
  • Đến đây, quay lại CMND / CCCD thì cũng có vẻ hợp lý phết nhỉ. =)) Nếu có phôi thật và con dấu thật thì (giống kiểu chép được key thật) thì cái CMND / CCCD cũng là thật CMNR.

Ai là người xác minh tính đúng đắn

Thường thì cái thằng cấp chả bao giờ nó gặp lại bạn để xác minh đâu

  • CMND / CCCD: VD: Cục quản lý cư dân chả bao giờ đi xác minh lại bạn trừ khi cần. Thường là một đơn vị khác như: Ngân hàng, nơi làm việc, ...
  • JWT: Là cái nơi mà bạn định truy xuất dữ liệu (Resource Server hay là API Server đó).

Làm sao để biết nó là đúng khi không phải người cấp ra

Không phải chỉ đọc thông tin là được đâu nhé. Lỡ đằng sau con dấu bố láo mà cũng nói là ok thì bỏ mẹ.

  • CMND / CCCD: Người cấp / nơi cấp / chính phủ / bộ công an sẽ công bố đặc điểm nhận dạng một CMND / CCCD cho toàn thể nhân dân biết để xác minh một CMND / CCCD là thật hay giả.
  • JWT: Cũng vậy luôn. Nơi cấp sẽ cung cấp secret key cho bên resources / api để verify được cái token xem có đúng không
  • Một cái mà nhiều người ngộ nhận: Dùng cái JWT đem decode ra, lấy được thông tin thế có nghĩa là verify rồi -> Cái này không phải nhá. Nó chỉ giống với việc đọc nội dung trên CMND / CCCD thôi, ai cũng có thể làm điều này. Nhưng cần 1 bước nữa là verify hay có thể coi là xác minh lại con dấu xem có phải do nhà nước / cơ quan có thẩm quyền cấp không.

Bảo mật

Về cơ bản là CMND / CCCD chả có bảo mật gì cả =))

  • CMND / CCCD: Không bảo mật hoặc mình không biết là nó bảo mật. Về cơ bản là ai cũng có thể làm giả khi có đầy đủ thiết bị.
  • JWT Token: Có thể làm giả khi nơi cấp JWT Token bị lộ secret key. Việc lộ này thường xảy ra khi nơi cấp gửi key cho nơi chứng thực. VD: Bạn có 2 cái server khác nhau. Một server là để authenticate và issue JWT Token, một server là resources server. Authentication server cần phải gửi key cho resource server thì resource server mới có thể xác minh token là đúng hay sai.
  • Về cơ bản là để sinh ra cái token thì sẽ dùng secret key, nếu mà không mang nó đi cho người khác xác minh thì về cơ bản nó vẫn an toàn, nhưng nếu để cho nơi khác xác minh thì không nên dùng phương pháp mã hóa đối xứng. Tức là issue token bằng 1 key và verify cũng chính bằng key đó. VD: Google, họ có IdP hay là Identity Provider, có rất nhiều ứng dụng nhờ google làm issue access Token key và chỉ verify xem key đó có dúng là do google issue hay không. Trường hợp này thì nên dùng mã hóa bất đối xứng. Issue bằng 1 key và verify bằng một key khác (Private key và public key).

Một vài hiểu lầm khi làm việc với JWT Token

  • JWT Token là bảo mật, quăng cái gì vào đó cũng được: Sai cmnr. Ai cũng có thể đọc nội dung của JWT Token bằng hàm (Decode) giống y chang việc ai cũng có thể đọc thông tin trên CMND / CCCD.
  • accessToken lưu ở client còn refreshToken lưu ở server: Sai luôn cmnr. Hãy nghĩ tới ví dụ: Ngân hàng giống như Resources server, khi CMND / CCCD của bạn hết hạn thì ngân hàng chỉ nói với bạn là: Anh / Chị ơi, CMND / CCCD của anh / chị hết hạn cmnr, anh chị đi đổi đi nhé. =)) Tự mang đi mà đổi, ai rảnh đâu mà đi đổi cho bạn. Thế nên cái refreshToken là dùng để đi đổi khi accessToken hết hạn nhé
  • accessToken quá lâu hết hạn: VD 1 ngày, 1 tháng: Ối zời ơi, nếu mà CMND / CCCD 100 năm mới hết hạn thì sao nhỉ? Thực ra 15 năm hết hạn là cũng có ý nghĩa của nó. VD sau 15 năm đặc điểm nhận dạng của bạn thường sẽ thay đổi chẳng hạn. Đối với JWT Token thì chỉ nên hết hạn sau khoảng 1h (Mặc định của Google Authentication) hoặc ngắn hơn nữa. 1p / 30s =)). Để đảm bảo là khi ai đó có được token của bạn, chưa làm được gì thì đã hết hạn cmnr.
  • Nếu có được refrehToken là có được tất cả, lúc nào lấy accessToken mới cũng được: Không phải đâu. Nếu mà một user bình thường thì việc đem refreshToken mà đi đổi accessToken mói sẽ không có chuyện gì xảy ra. Nhưng mà một ngày đẹp trời ai đó lấy được refreshToken của bạn rồi đem đi exchange accessToken khi bạn đang dùng hệ thống thì sao nhỉ? Có nghĩa là cái refreshToken được gửi tới IdP lớn hơn 1 lần. Lớn hơn 1 lần đấy nhé =)) Hãy để ý. Lớn hơn 1 lần -> Có nghĩa là hoặc bạn hoặc cái thằng ăn cắp token của bạn là người có vấn đề. Nhưng mà ai có vấn đề thì server nó cũng bảo là có vấn đề, thôi thì tao revoke mẹ nó cái token cho nó lành. Mày là user thật thì mày có thể login lại để có session mới. -> IdP cũng nhanh trí gửi mail cho bạn bảo là có ai đó đang dùng tài khoản của bạn, hoặc tài khoản của bạn có dấu hiệu bất thường =))
  • Mỗi khi request thì sẽ renew token bằng refreshToke: Không phải đâu. Chả lẽ mỗi lần đi ngân hàng hoặc đi máy bay thì phải đi đổi CMND / CCCD mới? Điên à? Mình vẫn dùng accessToken khi đang còn hạn. Nhưng mà mình sẽ kiểm tra lại xem token còn hạn hay không trước khi request, nếu hết hạn thì sẽ renew. VD: Mình lưu accessToken vào cookie, thời gian expire = thời gian expire của token. Nếu get accessToken trong cookie ra mà không còn nữa -> Hết hạn -> Call qua IdP để xin accessToken mới sau đó mới request tới resources server.
  • Authentication serverResources server bắt buộc phải là một: Sai cmnr. Giống y chang CMND / CCCD. Luôn luôn nghĩ đến việc 2 cái này khác nhau. Chỉ giống nhau khi cần giống nhau. VD: Bạn đi làm việc ở một công ty, công ty cấp cho bạn một thẻ nhân viên, và thẻ nhân viên này chỉ dùng ở công ty của bạn. Lúc này là 2 cái là một. Tuy nhiên nó vẫn do 2 bộ phận khác nhau, một là bộ phận cấp thẻ, còn khi bạn vào công ty thì bộ phận khác sẽ xác minh. Có thể là một cái máy chấm công chẳng hạn.

Kết luận

Cái gì cũng từ tự nhiên mà ra cả. Đôi khi bảo sao mà gia đình ấy có hoản cảnh giống trong phim thế. Có vẻ như là phim lấy ngoài đời làm cảm hứng để dựng lên phim ấy.

JWT Token có lẽ cũng vậy nhẩy mọi người.

Bài viết gốc: JWT Token hay là chứng minh nhân dân?


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.