Cookiee vs Session vs JWT hoạt động như thế nào ?
Cách đây không lây tôi phải tìm hiểu về một lỗi khi thao tác với session buộc tôi phải thực hiện một số nghiên cứu về session tôi nghĩ tôi sẽ chia sẻ những gì đã giúp tôi giải quyết lỗi của mình , để nó cũng có thể giúp các bạn hiểu hơn về session.
Session dịch sang tiếng Việt là phiên là một thuật ngữ trong lập trình web đề cập đến một tổ hợp rất nhiều thứ khác nhau : session login , session deskop , browser session , a tcp session , a shell session điều này gây khó khăn khi muốn hiểu chính xác session là gì ?. Tương tự đối với bộ đệm "cache" một thuật ngữ khó hiểu khác (database cache , browser cache , framework cache , network cache...."
Nhưng thật ra cái định nghĩa những thuật ngữ khó hiểu này dễ nhất là mô tả theo cách bạn sử dựng.
Vì vậy điều đầu tiên cần làm để hiểu về session chính là sử dụng chúng.
Nói chung , bạn cần hiểu sơ bộ rằng session là các state (trạng thái) khác nhau của ứng dụng trong thời gian người dùng tương tác với ứng dụng , mỗi state đương nhiên sẽ riêng biệt với mỗi người dùng.
Mình vừa nói rằng session là thể hiện của sự tương tác giữa người dùng và ứng dụng , nhưng tôi không chắc nó làm rõ vấn đề. Để cụ thể hơn tôi nói như thế này đối với session trên web , phiên là cấu trúc dữ liệu mà ứng dụng sử dụng để lưu trữ dữ liệu tạm thời nó chỉ có tác dụng trong thời gian mà người dúng truy cập ứng dụng và nó dành riêng cho người dùng.
Ví dụ : Bạn có thể lưu field username của user để không phải truy vấn cơ sở dữ liệu mỗi khi cần hoặc bạn có thể lưu trữ dữ liệu trong phiên để lưu trạng thái giữa các trang (phổ biến nhất là trong quy trình thanh toán của các trang thương mại điện tử)
Hãy nghĩ nó như một bộ nhớ tạm thời , có thể truy cập nhanh chóng được tạo ra cho mỗi người dùng ở mỗi lần thao tác với ứng dụng và khi người dùng thoát hoặc đóng cửa sổ trình duyệt.... session sẽ bị hủy.
Bộ nhớ tạm thời này có thể nằm trên hệ thống tệp trong các tệp văn bản , trên cơ sở dữ liệu hoặc trong bộ nhớ trong của ứng dụng
Hãy bắt đầu từ thời điểm bạn truy cập một trang web. Khi bạn nhận được dữ liệu của trang web từ server máy chủ đã gửi cho bạn (hầu hết mọi trường hợp trong cookie) sessionId mà nó tạo ra để xác định kết nối của bạn trong số rất rất nhiều yêu cầu mà server nhận được .
Thực hiện ví dụ , ấn F12 của bạn và kiểm tra cookie , bạn sẽ thấy một filed trông giống như thế này (đối với NodeJS) :
Nếu dùng JSP nó có Name : JESISSONID , nếu là ASP thì Name : ASPSESSIONID bên trên thì là đối với NodeJS.
Sau khi bạn đăng nhập và server xác thực được danh tính của bạn nó sẽ lưu thông tin người dùng (thông tin này bạn có thể config được nhưng phổ biến nhất thì sẽ lưu id của user) khi bạn lưu thông tin người dùng (id user) trong phiên , mỗi lần bạn gửi request server sẽ xác định bạn bằng cách truy vấn trong session (dựa vào sessionID) lấy được session của user đó rồi thì sẽ lấy được userId từ đó ta có thể truy cập thông tin của người dùng.
Bây giờ hãy nhìn vào sơ đồ bên trên để hiểu điều gì đã thực sự xảy ra khi bạn gửi một request đến server. Ví dụ : bạn request đến server và yêu cầu load trang gmail sau khi đăng nhập bạn muốn điều hướng đến giao diện hộp thư của gmail.
Bước đầu tiên : Bạn gửi request http đến máy chủ và yêu cầu trang . Cùng với request http này , bạn gửi sessionId của mình cho server để cho nó xác định danh tính của mình . Id phiên phổ biến nhất là được gửi trong cookie , nhưng có cũng có thể được gửi trong các tham số của GET hoặc POST . bất kể cách nào mà sessionID (5) được gửi đến server
Tiếp theo : Máy chủ nhận được sessionID của bạn trong request . Trước khi nó gửi dữ liệu cho bạn nó sẽ tìm kiếm trong kho lưu trữ session nó nhận ra 5 ứng với một sessionID , khi đã tìm được session trùng với sessionId mà user gửi server sẽ lấy userId để định danh user ở phía client.
Bước thứ 3 : Server sẽ tìm kiếm trong dữ liệu của user vừa tìm được bên trên và gửi dữ liệu về tương ứng với yêu cầu của bạn (bạn chú ý rằng server cũng sẽ gửi trả lại sessionId cùng với data gửi về cho client nhé ).
Mô tả tổng quát về cách thức hoạt động của sessions.

Như các bạn có thể thấy giữ cho user đăng nhập là tác dụng của session . Nhưng session cũng có thể sử dụng để lưu trữ một số dữ liệu tạm thời mà hoàn toàn độc lập với trạng thái đăng nhập do bạn quyết định , điều này giúp user có thể truy cập trang web nhanh hơn.
Session là gì ?
Session dịch sang tiếng Việt là phiên là một thuật ngữ trong lập trình web đề cập đến một tổ hợp rất nhiều thứ khác nhau : session login , session deskop , browser session , a tcp session , a shell session điều này gây khó khăn khi muốn hiểu chính xác session là gì ?. Tương tự đối với bộ đệm "cache" một thuật ngữ khó hiểu khác (database cache , browser cache , framework cache , network cache...."
Nhưng thật ra cái định nghĩa những thuật ngữ khó hiểu này dễ nhất là mô tả theo cách bạn sử dựng.
Vì vậy điều đầu tiên cần làm để hiểu về session chính là sử dụng chúng.
Nói chung , bạn cần hiểu sơ bộ rằng session là các state (trạng thái) khác nhau của ứng dụng trong thời gian người dùng tương tác với ứng dụng , mỗi state đương nhiên sẽ riêng biệt với mỗi người dùng.
Mình vừa nói rằng session là thể hiện của sự tương tác giữa người dùng và ứng dụng , nhưng tôi không chắc nó làm rõ vấn đề. Để cụ thể hơn tôi nói như thế này đối với session trên web , phiên là cấu trúc dữ liệu mà ứng dụng sử dụng để lưu trữ dữ liệu tạm thời nó chỉ có tác dụng trong thời gian mà người dúng truy cập ứng dụng và nó dành riêng cho người dùng.
Ví dụ : Bạn có thể lưu field username của user để không phải truy vấn cơ sở dữ liệu mỗi khi cần hoặc bạn có thể lưu trữ dữ liệu trong phiên để lưu trạng thái giữa các trang (phổ biến nhất là trong quy trình thanh toán của các trang thương mại điện tử)
Hãy nghĩ nó như một bộ nhớ tạm thời , có thể truy cập nhanh chóng được tạo ra cho mỗi người dùng ở mỗi lần thao tác với ứng dụng và khi người dùng thoát hoặc đóng cửa sổ trình duyệt.... session sẽ bị hủy.
Bộ nhớ tạm thời này có thể nằm trên hệ thống tệp trong các tệp văn bản , trên cơ sở dữ liệu hoặc trong bộ nhớ trong của ứng dụng
Điều thứ 2 bạn cần hiểu là cấu trúc của một session .
Session là một cấu trúc dữ liệu kiểu key-value . Tưởng tượng nó như một hashtable trong đó mỗi người dùng được cấp phát một hashkey để đưa dữ liệu của họ vào . hashkey chính là sessionId. và một cấu trúc dữ liệu sesson sẽ nhìn như thế này .
Và khi bạn nói "my session" tức là bạn đang đề cập đến dữ liệu(các cặp key-value) của bạn được lưu trong object session. Mỗi người dùng có thể truy cập phiên của họ và session có thể được lưu ở trên server hoặc client đều được . Nếu bạn lưu nó trên client bạn sẽ lưu nó trong trình duyệt rất có thể là trong cookie còn nếu bạn lưu nó trên server thì session ID sẽ được tạo ra và quản lý bởi máy chủ.
Vì vậy nếu có một triệu người dùng đang tương tác với server thì cũng đồng nghĩa sẽ có một triệu session Id được tạo trên server . Từ giờ mình sẽ chỉ đề cập đến hoàn cảnh mà session được lưu trên server ^^.
Session hoạt động như thế nào ?
Vậy chính xác thì làm thế nào để người dùng có thể truy cập session của họ ?
Đối với người dùng ứng dụng ví dụ như ứng dụng trên deskop , chỉ có một người dùng , do đó cũng có một phiên , ứng dụng không khó để tạo kết nôi giữa người dùng và dữ liệu trong session của họ.Tuy nhiên đối với một ứng dụng web , một server có rất nhiều client vậy làm thế nào để biết người dùng gửi request lên thuộc về session nào để giải quyết vấn đề này chúng ta sử dụng sessionId.
Nguyên tắc là thế này , đứng từ góc nhìn là bạn (người sử dụng trang web) cung cấp cho server sessionId đổi lại thì thằng server sẽ cho bạn quyền truy cập vào dữ liệu trong session nếu nó tìm thấy sessionId được lưu trữ trong kho dữ liệu về session của nó.
Cấu trúc dữ liệu của session giống như một cặp key-value với chìa khóa chính là sessionId , người dùng cung cấp khóa sessionId và server sẽ cho phép nó truy cập dữ liệu.
Để trực quan hơn hãy nhìn hình ảnh chi tiết xem nó hoạt động như thế nào ?
Hãy bắt đầu từ thời điểm bạn truy cập một trang web. Khi bạn nhận được dữ liệu của trang web từ server máy chủ đã gửi cho bạn (hầu hết mọi trường hợp trong cookie) sessionId mà nó tạo ra để xác định kết nối của bạn trong số rất rất nhiều yêu cầu mà server nhận được .
Thực hiện ví dụ , ấn F12 của bạn và kiểm tra cookie , bạn sẽ thấy một filed trông giống như thế này (đối với NodeJS) :
Nếu dùng JSP nó có Name : JESISSONID , nếu là ASP thì Name : ASPSESSIONID bên trên thì là đối với NodeJS.
Sau khi bạn đăng nhập và server xác thực được danh tính của bạn nó sẽ lưu thông tin người dùng (thông tin này bạn có thể config được nhưng phổ biến nhất thì sẽ lưu id của user) khi bạn lưu thông tin người dùng (id user) trong phiên , mỗi lần bạn gửi request server sẽ xác định bạn bằng cách truy vấn trong session (dựa vào sessionID) lấy được session của user đó rồi thì sẽ lấy được userId từ đó ta có thể truy cập thông tin của người dùng.
Bây giờ hãy nhìn vào sơ đồ bên trên để hiểu điều gì đã thực sự xảy ra khi bạn gửi một request đến server. Ví dụ : bạn request đến server và yêu cầu load trang gmail sau khi đăng nhập bạn muốn điều hướng đến giao diện hộp thư của gmail.
Bước đầu tiên : Bạn gửi request http đến máy chủ và yêu cầu trang . Cùng với request http này , bạn gửi sessionId của mình cho server để cho nó xác định danh tính của mình . Id phiên phổ biến nhất là được gửi trong cookie , nhưng có cũng có thể được gửi trong các tham số của GET hoặc POST . bất kể cách nào mà sessionID (5) được gửi đến server
Tiếp theo : Máy chủ nhận được sessionID của bạn trong request . Trước khi nó gửi dữ liệu cho bạn nó sẽ tìm kiếm trong kho lưu trữ session nó nhận ra 5 ứng với một sessionID , khi đã tìm được session trùng với sessionId mà user gửi server sẽ lấy userId để định danh user ở phía client.
Bước thứ 3 : Server sẽ tìm kiếm trong dữ liệu của user vừa tìm được bên trên và gửi dữ liệu về tương ứng với yêu cầu của bạn (bạn chú ý rằng server cũng sẽ gửi trả lại sessionId cùng với data gửi về cho client nhé ).
Mô tả tổng quát về cách thức hoạt động của sessions.

Như các bạn có thể thấy giữ cho user đăng nhập là tác dụng của session . Nhưng session cũng có thể sử dụng để lưu trữ một số dữ liệu tạm thời mà hoàn toàn độc lập với trạng thái đăng nhập do bạn quyết định , điều này giúp user có thể truy cập trang web nhanh hơn.



Nhận xét
Đăng nhận xét