"Đóng trình duyệt, session mất" hiểu thế nào cho đúng?

Cập nhật: Lượt xem: 245 [ PHP ]

Một session hay còn gọi là một phiên làm việc. Trong khoa học máy tính, Nó đơn giản là cách giao tiếp giữa client với server. Vậy có phải khi đóng trình duyệt thật sự session sẽ mất không ? Và session còn mất trong các trường hợp nào nữa?

"Đóng trình duyệt, session mất" hiểu thế nào cho đúng?

Đặt vấn đề

Mình đã nghe rất nhiều người nói "session sẽ mất khi đóng trình duyệt". Đặc biết là khi còn là sinh viên thì câu này là câu "thần chú" khi đi phỏng vấn. Vậy có phải khi đóng trình duyệt thật sự session sẽ mất không? Và session còn mất trong các trường hợp nào nữa?

Note: Bài này mình dùng ngôn ngữ php và nginx nhé

Session là gì?

Một session hay còn gọi là một phiên làm việc. Trong khoa học máy tính, Nó đơn giản là cách giao tiếp giữa client với server. Một session bắt đầu khi client gửi request đến sever, nó tồn tại xuyên suốt từ trang này đến trang khác trong ứng dụng và chỉ kết thúc khi hết thời gian timeout . Giá trị của session sẽ được lưu trong một tệp tin trên máy chủ.

Khái niệm session chắc không quá xa lạ nữa. Mình muốn làm rõ hơn nữa khái niệm này:

"Giá trị của session sẽ được lưu trong một tệp tin trên máy chủ"

Mình muốn biết tập tin đó lưu trữ nhưng gì và ở đâu ?

Mình sẽ tạo ra 1 session và lưu 1 số giá trị vào:

<?php
session_start();

$_SESSION["color"] = "red";
$_SESSION["color1"] = "yellow";

echo "Session is created";

Sau đó mở trình duyệt chrome để chạy.

create_session

Vậy là mình đã tạo session thành công.

Thì mặc định session sẽ được lưu /var/lib/php/session nhé và chúng ta có thể thay đổi nơi lưu trữ session trong file php.ini

session_location

Mình thấy có file sess_qg2vvqet5ft791f4hgc49hcqr8 được tạo ra. thử mở ra xem có gì bên trong nào.

session_content

Vậy là trong file lưu tên và giá trị mà chúng ta vừa set vào còn s:3 và s:6 là kiểu dữ liệu và độ dài (String độ dài 3 và String độ dài 6)

Cách phân biệt session của các trình duyệt khác nhau

  • Session khi sinh ra được lưu trên 1 file có tên dài dòng, khó đoán và được tạo ngẫu nhiên là session id trên máy chủ, và đồng thời gửi lại cho client 1 Session cookie (không phải session) có nội dung (hay giá trị) đúng như session id (để có thể so khớp session nào là của client nào).

Session cookie (không phải session) khác với cookie thông thường đó là khi đóng trình duyệt thì loại cookie này sẽ mất.

Vậy chúng ta tìm trên trình duyệt chrome xem cookie này như thế nào:

session_on_browser

Đối với mỗi ngôn ngữ lập trình web sẽ có tên Session cookie quy định như php là PHPSESSID, jsp là JSESSIONID, …

Vậy PHPSESSID của trình duyệt này là qg2vvqet5ft791f4hgc49hcqr8 và nó match đúng với file vừa được tạo ra trên server.

Để làm dõ hơn thì mình mở bằng trình duyệt firefox.

create_session_on_Firefox

Sau khi chạy thì mình thấy trên server có tạo thêm 1 file sess_su7q6pskehc3nfqiu479p4oqvn

session_location_2

Và session cookie của trình duyệt firefox cũng khớp đúng với file đó.

Vậy dựa vào PHPSESSID đó mà server có thể phân biệt được session nào là của trình duyệt nào.

Timeout của session

Là khoảng thời gian mà session tồn tại nếu không có request từ client đến server, mặc định là 24 phút. Bạn cũng có thể thay đổi khoảng thời gian này phong file php.ini

Quay lại vấn đề

Dựa vào những thứ tìm được từ bên trên mình sẽ đặt giả thiết thế này cho hình dung:

  • Tủ (session) 📮
  • Chìa khóa (Session cookie) 🔑
  • Bạn (client) 🧒
  • người cho thuê tủ (server) 👴
  • Đồ dùng trong tủ (nội dung của session) 📜

Qui định :

  • Mỗi chìa khóa chỉ mở được 1 tủ, mỗi tủ có đồ dùng bên trong.
  • Nếu bạn không quay lại sử dụng tủ thì tủ sẽ bị thi hồi sau 1 khoảng thời gian (do người cho thuê quyết định) kể cả bạn có chìa khóa. 😂
  • Nếu làm mất chìa khóa thì bạn sẽ không sử dụng được tủ.

Như đã biết thì đóng trình duyệt thì Session cookie sẽ mất.

Trường hợp này được tưởng tượng như sau:

Người cho thuê tủ cho bạn thuê tủ và đưa cho bạn chìa khóa để sử dụng cái tủ đấy. nhưng vô tình bạn làm mất chìa khóa. Mặc dù vẫn có tủ ở đấy. Và theo quy định bạn không sử dụng tủ trong 1 khoảng thời gian thì tủ sẽ bị thu hồi.

Vậy câu "session sẽ mất khi đóng trình duyệt"

Trường hợp này sẽ là: Tủ sẽ bị thu hồi khi bạn mất chìa khóa. nhưng thật ra bạn mất chìa khóa thì tủ vẫn còn đó. chỉ là do không có chìa khóa bạn không thể sử dụng được tủ và do không sử dụng lên sau 1 khoảng thời gian tủ sẽ bị thu hồi.

Kết luận

Vậy **đóng trình duyệt thì session bị mất ** . Lý do là khi đóng trình duyện thì Session cookie của bạn bị xóa, và vì không có cái Session cookie nữa nên server không biết bạn là ai còn cái session cũ của bạn thì vẫn còn ở đó. Và do sau 1 khoảng thời gian được quy định session ấy không được sử dụng đến vì vậy nó đã bị kill.

Qua bài viết này, mình muốn làm rõ hơn vì sao đóng trình duyệt thì session bị mất, qua đó cũng hiểu rõ hơn về cớ chế hoạt động của session.

Loading...