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ớiJWT
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ênissuer
/iss
-> Ý nghĩa tương tự. - Ngày hến hạn: 01/01/2025 (Đối với
JWT
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ẽ mangCMND / CCCD
cũ đến nơi có thẩm quyền để đổi / cấp mới. (Đối vớiJWT
thì cũng tương tự, nhưng thường được nhắc đến với cái tênrefreshToken
) - 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ằngCMND / 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áiCMND / 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 Toke
n: 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ủaJWT Token
bằng hàm (Decode
) giống y chang việc ai cũng có thể đọc thông tin trênCMND / 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, khiCMND / 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áirefreshToken
là dùng để đi đổi khiaccessToken
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ớiJWT 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 đượcrefreshToken
của bạn rồi đem đi exchangeaccessToken
khi bạn đang dùng hệ thống thì sao nhỉ? Có nghĩa là cáirefreshToken
đượ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 đổiCMND / CCCD
mới? Điên à? Mình vẫn dùngaccessToken
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 quaIdP
để xinaccessToken
mới sau đó mới request tới resources server. Authentication server
vàResources server
bắt buộc phải là một: Sai cmnr. Giống y changCMND / 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.