JWT không nên sử dụng thay cho session? Vì sao?

Nội dung bài viết

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

Lời nói đầu

Chủ đề này đã có người từng hỏi tips javascript, cụ thể là "Anh ơi! Mình thay thế jwt cho session được không?". Với tôi thật sự mà nói là không nên. Nhưng chưa có cơ hội để viết một bài cho rõ ràng. Cũng may vừa rồi mình theo dõi một page và tìm ra một bài viết có thể nói là đúng nhất theo ý kiến của mình. Vậy cho nên DỊCH một chút này cho anh em. Một số anh em lười đọc cho nên mình cũng tóm tắt lại luôn, để khỏi đọc nhiều. Bài viết này, bạn sẽ hiểu được khái niệm cơ bản là cookie là gì? Session là gì? đó là khái niệm cơ bản, nâng cao hơn, đó là việc xưa đến giờ nhiều anh em còn chưa biết "Session được lưu trữ ở đâu?"

Series Token here.

Ở trong này tác giả có đề cập đến rất rõ. Tiếp tục đó vào vấn đề chính, lợi thế của token so với session và cookie trong việc vận chuyển dữ liệu giữa Client và Server. Tiếp theo là những hạn chế là, giờ đây có nhiều application đã chia tay cơ chế xác thực với token. Còn có một câu hỏi nữa đó là, tại sao TOKEN phổ biến nhiều diễn đàn như reddit, hay blog javascript nói đến nhiều như thế?... Và còn nhiều nữa. Sau đây, là bản dịch robot của chúng tôi. Nếu trong quá trình dịch, có từ ngữ hay ngữ cảnh không đúng với ngữ nghĩa thì các bạn có thể đóng góp về cho chúng tôi. Hy vọng bài viết bày mang đến cho các bạn một cách nhìn mới về token cũng như jwt.
Nguyên gốc bài viết: https://subrss.com/bookmarks/60adb144ca5d5569a97076c2/comments

Cookie là gì?

Khi thiết kế các ứng dụng web, (đặc biệt là loại HTML truyền thống), tại một thời điểm, bạn sẽ phải tìm ra cách đăng nhập người dùng và giữ cho họ đăng nhập giữa các yêu cầu. Cơ chế cốt lõi mà chúng tôi sử dụng cho việc này là cookie. Cookie là các chuỗi nhỏ do máy chủ gửi đến máy khách. Sau khi khách hàng nhận được chuỗi này, nó sẽ lặp lại điều này trong các yêu cầu tiếp theo. Chúng tôi có thể lưu trữ 'user id' trong cookie và đối với bất kỳ yêu cầu nào trong tương lai, chúng tôi sẽ biết user_id của khách hàng là gì.

Cookie: USER_ID=123

Nhưng điều này rất không an toàn. Thông tin nằm trong trình duyệt, có nghĩa là người dùng có thể thay đổi USER_ID và được xác định là một người dùng khác.

Session là gì?

Cách truyền thống để giải quyết vấn đề này được gọi là 'Session'. Tôi không biết cách sử dụng sớm nhất của các Session là gì, nhưng nó có trong mọi khung công tác web và kể từ khi các khung công tác web là một thứ. Thông thường, Session và cookie được mô tả là 2 thứ khác nhau, nhưng chúng thực sự không phải vậy. Một Session cần một cookie để hoạt động.

Cookie: MY_SESSION_ID=WW91IGdvdCBtZS4gRE0gbWUgb24gdHdpdHRlciBmb3IgYSBmcmVlIGNvb2tpZQ

Thay vì một id người dùng có thể dự đoán được, chúng tôi đang gửi cho khách hàng một Session id hoàn toàn ngẫu nhiên khó đoán. ID không có ý nghĩa gì nữa và không giải mã cho bất kỳ thứ gì. Đây đôi khi được gọi là mã thông báo không rõ ràng. Khi một máy khách gửi lại sessionid cho server, thì lúc này máy chủ sẽ tra cứu id ví dụ trong cơ sở dữ liệu, và liên kết nó trở lại với id người dùng. Khi người dùng muốn đăng xuất, sessionid sẽ bị xóa khỏi bộ lưu trữ dữ liệu, có nghĩa là cookie không còn được liên kết với người dùng nữa.

Session được lưu trữ ở đâu?

Các ngôn ngữ như PHP có một hệ thống lưu trữ được tích hợp sẵn và theo mặc định sẽ lưu trữ dữ liệu trong hệ thống tệp cục bộ. Trong hệ sinh thái Node.js, theo mặc định, dữ liệu này sẽ nằm trong 'Memory' và tất nhiên là session này sẽ biến mất sau khi server khởi động lại.  Phần này đọc thêm về "Memory leak là gì? Cách khắc phục"

Những cách tiếp cận này có ý nghĩa trên các máy của nhà phát triển hoặc khi các trang web được lưu trữ trên các máy chủ vật lý từ lâu đời rồi, nhưng ngày nay việc triển khai thường có nghĩa là một 'hệ thống' hoàn toàn mới, vì vậy thông tin này cần được lưu trữ ở một nơi có tuổi thọ cao hơn máy chủ . Một lựa chọn dễ dàng là cơ sở dữ liệu, nhưng các trang web thường sử dụng các hệ thống như Redis và Memcached, hoạt động cho các trang nhỏ nhưng vẫn hoạt động ở quy mô lớn. 


Vì mình có gửi lời đề nghị dịch rồi, nhưng tác giả bài viết chưa reply nên anh em gắng đọc bài viết full ở đây nhé. Nếu được đồng ý mình dịch tiếp...


 Bài viết gốc: "WT should not be your default for sessions" 

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