Token là gì? Và tại sao lại có Refresh token

Nội dung bài viết

Video học lập trình mỗi ngày

Làm rõ khái niệm token, refresh token là gì? Token là gì? Authentication là gì? Session, cookies, SessionId... Nó là gì? Những khái niệm này tưởng chừng như ai cũng biết. Nhưng không hẳn như vậy, khi được hỏi thì trả lời một cách mông lung kiểu như mã hoá dữ liệu vậy. Đây, các bạn có thể tham khảo thêm định nghĩa ở bài post này

Muốn được hiểu tốt nhất về Token các bạn nên dành thời gian theo dõi series về token, tôi tin có những câu trả lời rất hay ở trong đó.

Trước tiên khi đi vào những khái niệm thì chúng ta mỗi người một quan điểm cũng như mỗi devjs một cách code khác nhau. Và trong bài post này, tôi chỉ đưa ra ý kiến riêng của mình trong quá trình làm việc. Nếu có gì thiếu sót hoặc sai. Tôi mong rằng vẫn được nhận những lời đánh giá và sửa sai của các bạn. Mong rằng chúng ta cùng nhau lớn mạnh trong nghề nghiệp của chúng ta.


Tips: JSON Web Token (JWT) - Thực hành sử dụng refresh token khi token hết hạn với nodejs và express js


Token là gì?


Về token là một keyword mà nhiều bạn ở Tips Javascript Việt Nam cũng đã nó rất nhiều - Đọc thêm về Token trong ứng dụng . Nhưng ở đó chỉ đưa ra những cách giải quyết logic và sử dụng token. Tôi thấy token chưa nói nhiều về khái niệm chính xác của bản chất token.

Trong lập trình nó chính xác theo tôi được gọi là Acesss Token nhưng nó dài quá nên cứ gọi là token.

Vậy token là gì?

- token chính là một thông tin rất cần thiết hay còn gọi là công cụ để truy cập giao diện tài nguyên (API)

- token bao gồm những gì (Chút nữa tôi sẽ nói rõ hơn cuối bài): uid (danh tính duy nhất của người dùng), thời gian (dấu thời gian của thời gian hiện tại), ký hiệu (chữ ký, một vài chữ số đầu tiên của token được nén thành một chuỗi thập lục phân có độ dài nhất định bằng thuật toán Hashing hay còn gọi là băm)

- Tại sao lại sử dụng token

  • Server không trạng thái và khả năng mở rộng tốt
  • Hỗ trợ cho thiết bị di động rất tốt về vấn đề get resource
  • Bảo mật
  • Hỗ trợ các cuộc gọi chéo tên miền hay application - Ví dụ: nếu ứng dụng được triển khai trên a.com, dịch vụ api được triển khai trên b.com và yêu cầu ajax được gửi từ a.com đến b.com.

Notes:

+ Server không trạng thái chính là không có bộ nhớ để xử lý giao dịch và phía server không lưu bất kỳ thông tin phiên nào mỗi khi client request và server response. Giống như bạn đang đọc bài này, không cần phải cho đi và server cũng không cần check bạn là gì?

- Quá trình xác thực token hay còn gọi là Authentication token: Xem thêm tại bài viết này vì cũng nói khá rõ "Quy trình việc xác thực JWT với NODEJS."

Notes: Authentication là gì? Khái niệm này cũng phải làm rõ trong những bài sau. Nó xuất phát từ cải cách Thương Dương ở Trung Quốc, nguồn gốc phát minh ra CMND ngày nay.

- Mỗi yêu cầu cần mang token và token cần được đặt trong header HTTP ????

- Xác thực người dùng dựa trên token là phương thức xác thực không trạng thái trên Server. Server không cần lưu trữ dữ liệu token. Do đó giảm áp lực cho Server và giảm query liên tục và thường xuyên dưới Database.

- Token được quản lý hoàn toàn bởi ứng dụng, vì vậy nó có thể bỏ qua CORS.

Token được lưu ở đâu?

Thường thì khi client được return về token thì sẽ lưu ở hai chỗ phổ biến đó là CookieslocalStorage. Ngoài ra còn có sessionstorageindexDB nhưng sessionstorageindexDB thì tôi ít thấy và theo tôi không nên sử dụng. Vấn đề này không bàn nữa vì nó đã được giải thích rồi "Lưu trữ và bảo mật tokens trên client như thế nào?" 

Token gửi từ client theo cách nào?

Với tôi hiện tại có 3 cách gửi token xuống server

Cách 1:

Đặt trên header HTTP mỗi khi request

GET /application/v1/events
Host: api.example.com
Authorization: Bearer 

Cách 2:

Khi tên miền chéo (đọc lại trên kia), bạn có thể đặt TOKEN trong phần body data như kiểu POST.

Cách 3:

Chuyển qua URL

http://www.example.com/user?token=xxxxxxx

Sử dụng cách nào tuỳ mỗi bạn và mỗi dự án, ở đây không bàn luận.

Ngoài token thì ứng dụng sử dụng gì xác thực

Chúng ta sẽ nói về session và Cookies vì 2 loại đó sẽ thay thế token. Nếu những dự án khác không sử dụng token. Vì thật ra token có nhược điểm rất lớn. Nói sau.

Sử dụng token cần xem xét những gì?

  • Nếu bạn nghĩ rằng việc sử dụng cơ sở dữ liệu để lưu trữ Token sẽ khiến truy vấn mất quá nhiều thời gian, bạn có thể chọn lưu trữ trong bộ nhớ. Ví dụ: redis rất phù hợp với nhu cầu truy vấn Token của bạn.
  • Token được quản lý hoàn toàn bởi ứng dụng, vì vậy nó có thể bỏ qua chính sách CORS
  • Token có thể tránh các cuộc tấn công CSRF (vì cookie không còn cần thiết)
  • Điện thoại di động không hỗ trợ cookie tốt và vì vậy Token thường được sử dụng trên những ứng dụng trên mobile.

Refresh Token là gì?

Refresh token thực chất nó cũng chính là một token. Nhưng nó khác với Token Auth của JWT về chức năng đó là Refresh Token chỉ có một nhiệm vụ duy nhất đó là đề lấy một token mới, nêú token được cấp phát cho user hết hạn. Refresh token được cấp cho User cùng với token khi user xác thực đầu tiên nhưng thời gian của chúng khác nhau. Với token thì có thể 1 giờ, nhưng Refresh Token là có khi là 10 ngày. Nhưng đến đây tôi chợt nhớ ra rằng có một bài viết đầy đủ hơn cho lời giải thích này, và ở bài viết đó chúng ta sẽ làm sáng tỏ nhiêu hơn ví dụ như Refresh token sẽ được lưu ở đâu? hạn chế khi sử dụng Refresh token ... Đây, chính là bài viết: Refresh token là gì? Cách hoạt động có khác gì so với token không?

Có thể bạn đã bị missing