Open utterances-bot opened 1 year ago
Chào anh, sau khi đọc xong bài viết này thì em có một thắc mắc như sau.
Khi mà access token
hết hạn thì ta sẽ đồng thời tạo ra cả access token
và refresh token
(rt
) mới, vậy thì exp
của rt
mới có cần thiết phải bằng với exp
của rt
cũ không anh. Tại vì nếu mình tạo mới rt
với một exp
càng tiến về tương lai thì có thể nói là người dùng sẽ được đăng nhập mãi mãi (trừ khi họ gọi api logout hoặc server xóa rt
). Điều này có gây ra vấn đề gì về bảo mật không ạ.
Chào anh, sau khi đọc xong bài viết này thì em có một thắc mắc như sau. Khi mà
access token
hết hạn thì ta sẽ đồng thời tạo ra cảaccess token
vàrefresh token
(rt
) mới, vậy thìexp
củarefresh token
mới có cần thiết phải bằng vớiexp
củarefresh token
cũ không anh. Tại vì nếu mình tạo mớirt
với mộtexp
càng tiến về tương lai thì có thể nói là người dùng sẽ được đăng nhập mãi mãi (trừ khi họ gọi api logout hoặc server xóart
). Điều này có gây ra vấn đề gì về bảo mật không ạ.
expire time của Refresh Token mới bằng cái cũ em nhé
Chào anh Được, cảm ơn anh Được về bài viết rất hay này ạ. Em có câu hỏi muốn hỏi: Giả sử muốn người dùng auto logout sau 1 ngày thì phải làm thế nào ạ? Vì mỗi lần lấy Refresh Token mới thì expire time của Refresh Token mới bằng cái cũ, vì vậy nó sẽ không bao h hết hạn mà.
Chào anh Được, cảm ơn anh Được về bài viết rất hay này ạ. Em có câu hỏi muốn hỏi: Giả sử muốn người dùng auto logout sau 1 ngày thì phải làm thế nào ạ? Vì mỗi lần lấy Refresh Token mới thì expire time của Refresh Token mới bằng cái cũ, vì vậy nó sẽ không bao h hết hạn mà.
Chắc anh viết expire time bằng cái cũ làm nhiều bạn dễ hiểu lầm. Ví dụ RT cũ là đến tháng 10 2022 thì RT mới cũng là tháng 10 2022 em nha. Cái này phải gọi là expire date cho chuẩn.
Anh sẽ Note lại trên đó cho đỡ hiểu lầm.
Muốn auto logout sau 1 ngày thì set thời gian hết hạn RT là 1 ngày là đc em nhé
Chào anh Được, cảm ơn anh Được về bài viết rất hay này ạ. Em có câu hỏi muốn hỏi: Giả sử muốn người dùng auto logout sau 1 ngày thì phải làm thế nào ạ? Vì mỗi lần lấy Refresh Token mới thì expire time của Refresh Token mới bằng cái cũ, vì vậy nó sẽ không bao h hết hạn mà.
Chắc anh viết expire time bằng cái cũ làm nhiều bạn dễ hiểu lầm. Ví dụ RT cũ là đến tháng 10 2022 thì RT mới cũng là tháng 10 2022 em nha. Cái này phải gọi là expire date cho chuẩn.
Anh sẽ Note lại trên đó cho đỡ hiểu lầm.
Muốn auto logout sau 1 ngày thì set thời gian hết hạn RT là 1 ngày là đc em nhé
À dạ vâng nếu thế thì em hiểu rồi ạ. Em tưởng là expire time bằng cái cũ có nghĩa là cái cũ 3 ngày, thì cái mới cũng 3 ngày, nghĩa là nó cứ được cộng mới liên tục -> Nó sẽ không bao giờ hết hạn cả. Còn nếu RT mới sẽ là từ khoảng làm mới đến mốc RT time cũ (đoạn time còn lại) thì nó sẽ hết hạn vào đúng mốc mà mình set.
Nhờ các bài viết chất lượng trên blog của anh (phải nói là blog bằng tiếng Việt về Web developer mà em thích nhất vì độ chỉn chu cũng như kiến thức nó mang lại) nên em mới quất luôn 2 khóa React và Node của anh để tu luyện thêm. Hi vọng mỗi tuần ngoài dành tg làm khóa học thì anh có thể viết thêm blog để share kiến thức nữa thì quá tiệt zời luôn^^. VD như các bài viết nào hịn hịn thì dành cho các học viên chẳn hạn kk. Chiêu này tuy hơi marketing nhưng em nghĩ nó xứng đáng vs kiến thức anh đem lại đó ạ.
Refresh token sẽ bị xóa trong những trường hợp sau đây đúng ko anh? Nếu còn trường hợp nào thì anh bổ sung giúp em với. Em cảm ơn!
Bạn nói rằng không cần truy cập database vì jwt là self-contained vậy, giải sử tôi lưu cả role vào jwt để khỏi xuống database, nếu như tôi thay đổi role đó thành role khác thì ngươi có phải xuống db đọc không?
Bạn nói rằng không cần truy cập database vì jwt là self-contained vậy, giải sử tôi lưu cả role vào jwt để khỏi xuống database, nếu như tôi thay đổi role đó thành role khác thì ngươi có phải xuống db đọc không?
Nếu bạn thay đổi role thì bạn phải đợi đến khi access_token của người đấy hết hạn và thực hiện refresh token thì client mới nhận role mới đc nhé. Đó là lý do vì sao access token có thời gian hết hạn ngắn.
Vấn đề này mình cũng có nói ở trên bài viết là jwt nó không có tính ngay lập tức, có thể cải thiện bằng dùng thêm socket để ép người dùng refresh token ngay thời điểm change role chẳng hạn.
Tương tự như case admin cho ép logout 1 user vậy
em có thắc mắc là Client lưu trữ access token và refresh token ở bộ nhớ thiết bị (cookie, local storage,...). ví dụ mình đăng nhập và thao tác ở tab này xong mình mở ẩn danh lên r copy access token và refresh token ở bên kia bỏ vào ẩn danh thì mọi thứ nó cũng work như bình thường.Như vậy thì sao anh !!
em có thắc mắc là Client lưu trữ access token và refresh token ở bộ nhớ thiết bị (cookie, local storage,...). ví dụ mình đăng nhập và thao tác ở tab này xong mình mở ẩn danh lên r copy access token và refresh token ở bên kia bỏ vào ẩn danh thì mọi thứ nó cũng work như bình thường.Như vậy thì sao anh !!
Đúng rồi em, work như thường. Em thấy facebook cũng hoạt động thế á. Copy cookie qua trình duyệt khác là work như thường
Bài viết rất chi tiết, dễ hiểu và hữu ích. Cảm ơn anh và chúc anh nhiều sức khỏe!
Em có thắc mắc là nếu dùng Refresh Token thì sao không dùng luôn CSRF Token, vì 2 thằng đều lưu Token ở Database với lại Refresh Token lại rườm rà hơn?
Cảm ơn anh về bài viết, anh cho em hỏi ạ: Vậy ví dụ em có cái Access Token (AC) rồi thì em có thể decode ra và thay đổi cái payload đúng không anh (ví dụ em có id của user khác) rồi em cập nhật lại là có phải em đã truy cập như user đó bình thường rồi đúng không anh?
Em có thắc mắc là nếu dùng Refresh Token thì sao không dùng luôn CSRF Token, vì 2 thằng đều lưu Token ở Database với lại Refresh Token lại rườm rà hơn?
Mỗi lần request đến server thì chỉ cần validate cái access token thôi, cái access token này không cần lưu ở DB gì cả, nên nó nhanh và dễ scale hơn việc mỗi lần request phải vào DB check. Còn refresh token thì vài phút mới check 1 lần
Cảm ơn anh về bài viết, anh cho em hỏi ạ: Vậy ví dụ em có cái Access Token (AC) rồi thì em có thể decode ra và thay đổi cái payload đúng không anh (ví dụ em có id của user khác) rồi em cập nhật lại là có phải em đã truy cập như user đó bình thường rồi đúng không anh?
Có có thể decode bất cứ token nào dạng JWT để lấy payload. Nhưng em không thể verify cái JWT đó được, vì em không có private key.
Bây giờ em decode cái JWT ra payload, em tạo 1 JWT mới thì em cần có private key, nếu em điền đại 1 private key thì BE nó verify không đúng, nó loại ngay.
Cảm ơn anh về bài viết, anh cho em hỏi ạ: Vậy ví dụ em có cái Access Token (AC) rồi thì em có thể decode ra và thay đổi cái payload đúng không anh (ví dụ em có id của user khác) rồi em cập nhật lại là có phải em đã truy cập như user đó bình thường rồi đúng không anh?
Có có thể decode bất cứ token nào dạng JWT để lấy payload. Nhưng em không thể verify cái JWT đó được, vì em không có private key.
Bây giờ em decode cái JWT ra payload, em tạo 1 JWT mới thì em cần có private key, nếu em điền đại 1 private key thì BE nó verify không đúng, nó loại ngay.
à em hiểu rồi, cảm ơn anh
hi anh, em có xem qua 1 vài cách để revoke token, trong đó bao gồm có sử dụng redis thiết kế 1 blacklist để lưu các token còn hạn nhưng invalid, thì token nên bỏ vào blacklist là refresh token hay access token vậy anh ?
hi anh, em có xem qua 1 vài cách để revoke token, trong đó bao gồm có sử dụng redis thiết kế 1 blacklist để lưu các token còn hạn nhưng invalid, thì token nên bỏ vào blacklist là refresh token hay access token vậy anh ?
access token em nhé
Bài viết rất rất hay, thank tác giả đẹp zai rất nhiều
Em thắc mắc là mỗi lần mình request là mình phải tạo mới refresh token, rồi xóa refresh token cũ trong database và thêm mới vào đúng không ạ
Em có thêm thắc mắc là khi thêm refresh token thì mình query database lấy refresh token bằng cái gì ạ. Id của refresh token hay chính cái refresh token đó.
Em thắc mắc là mỗi lần mình request là mình phải tạo mới refresh token, rồi xóa refresh token cũ trong database và thêm mới vào đúng không ạ
mỗi lần request refresh token thì là vậy em, chứ không phải là mỗi lần request
Em có thêm thắc mắc là khi thêm refresh token thì mình query database lấy refresh token bằng cái gì ạ. Id của refresh token hay chính cái refresh token đó.
request refresh token thì gửi refresh token cũ lên. Bên backend lấy refresh token cũ đó để tìm trong db
cho mình hỏi 1 chút " - Server trả về access token và refresh token cho client.
cho mình hỏi 1 chút " - Server trả về access token và refresh token cho client.
- Client lưu trữ access token và refresh token ở bộ nhớ thiết bị (cookie, local storage,...). " người dùng lưu cả at và rt ở client thế này thì bảo mật hơn gì khi chỉ lưu access token nhỉ ?, vì nếu lộ đc access token thì cũng có thể lộ luôn cả refresh token và hoàn toàn có thể dùng refresh token để cấp ac mới
Bây giờ nếu chỉ sử dụng access token thì access token sẽ có thời gian hết hạn rất lâu để app không bị logout ra ngoài. Mà access token là stateless nghĩa là không lưu access token ở backend dẫn đến nếu backend muôn hủy access token này thì không được.
Đó là lý do người tạo tạo refresh token, vẫn đảm bảo access token là stateless, nếu muốn hủy access token thì xóa refresh token ở backend và đợi access token hết hạn (thường access token sẽ có thời gian hết hạn là vài phút) là được.
Trong trường hợp nếu để lộ access token và refresh token, chúng ta chỉ cần remove các refresh token của user đấy ở backend là được bạn nhé.
Bài viết hay nhất về Jwt em đọc từ trước đến giớ, không chỉ hay về phần nội dung, mà phần comment cũng nhiều cái hay.
[P3] Giải ngố authentication: JWT
JSON Web Token (JWT) là một phương pháp xác thực được dùng rất phổ biến hiện nay, nhưng nhiều bạn không hiểu rõ JWT. Bài viết này sẽ giúp các bạn
https://duthanhduoc.com/blog/p3-giai-ngo-authentication-jwt#o-client-thi-nen-luu-access-token-va-refresh-token-o-dau