duthanhduoc / duthanhduoc.com-page

0 stars 0 forks source link

blog/p3-giai-ngo-authentication-jwt #7

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

[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

8naf commented 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 tokenrefresh 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 ạ.

duthanhduoc commented 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 tokenrefresh token (rt) mới, vậy thì exp của refresh token mới có cần thiết phải bằng với exp của refresh token 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 ạ.

expire time của Refresh Token mới bằng cái cũ em nhé

toanutt commented 1 year ago

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à.

duthanhduoc commented 1 year ago

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é

toanutt commented 1 year ago

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.

nguyenhoaikhang37 commented 1 year ago

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 đó ạ.

boyhotkey96 commented 1 year ago

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!

anhdinh commented 10 months ago

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?

duthanhduoc commented 10 months ago

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

phamtronghieu2002 commented 10 months ago

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 !!

duthanhduoc commented 9 months ago

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

chep267 commented 9 months ago

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!

trungbb7 commented 9 months ago

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?

K1ethoang commented 8 months ago

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?

duthanhduoc commented 8 months ago

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

duthanhduoc commented 8 months ago

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.

K1ethoang commented 8 months ago

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

nobug1312 commented 7 months ago

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 ?

duthanhduoc commented 7 months ago

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é

Honghung123 commented 7 months ago

Bài viết rất rất hay, thank tác giả đẹp zai rất nhiều

Honghung123 commented 7 months ago

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 ạ

Honghung123 commented 7 months ago

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 đó.

duthanhduoc commented 6 months ago

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

duthanhduoc commented 6 months ago

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

Joinht commented 6 months ago

cho mình hỏi 1 chút " - Server trả về access token và refresh token cho client.

duthanhduoc commented 6 months ago

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é.

longnh299 commented 5 months ago

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.