Session, Cookie là khái niệm mà bắt buộc một lập trình viên phải hiểu và nắm rõ. Ở bài viết này, chúng ta sẽ cùng tìm hiểu về nó và một số điểm cần lưu ý trong quá trình làm việc.
Cookie
// Example with all params
const Date = new Date();
date.setTime(Date.now() + 5000)
document.cookie = `key=value; domain=.taptanh.dev; expires=${data.toUTCString()};
max-age=5; path=/homepage; HttpOnly; Secure, same-site=Lax`
Cookie có thể được tạo từ javascript ở phía client, hoặc cũng có thể set bởi server bằng response set header.
Mỗi request khi gọi tới server đều được đính kèm cookie một cách tự động.
Giải thích một số config có trong cookie
- Domain: domain write, read được cookie, mặc định là domain mà request được gọi. Nếu muốn cookie đọc hiểu ở cả subdomain nữa thì phải có dot ở đằng trước, vd domain=”*.taptanh.dev”
- Path: Đường dẫn mà cookie có hiệu lực, mặc định là “/” có giá trị ở tất cả đường dẫn
- Expires: Thời gian mà cookies có hiệu lực, mặc định là session(session client là phiên làm việc của trình duyệt khác với định nghĩa session của server), cookie sẽ được clear khi phiên kết thúc (đóng trình duyêt).
- Thay vì dùng Expires với value là 1 thời gian cụ thể thì ta có thể dùng cách khác là max-age để set 1 khoảng thời gian so với hiện tại (vd max-age: 5 sau 5s)
- Chú ý: Nếu setting trình duyệt mở lại phiên làm việc trước đó (”Continue where you left off”) thì khi mở lại trình duyệt sẽ ko clear cookie, phiên làm việc được restore và cookie vẫn sẽ còn nguyên.
- Size: kích thước của cookie, max size: 4KB
- HTTP only: Cookie chỉ được gọi hiểu từ request HTTP, nghĩa là chỉ write, read từ phía server, javascript sẽ ko đọc được cookie, (document.cookie = undefined), giúp bảo vệ khỏi XSS, giảm nguy cơ bị đánh cắp cookie, bảo vệ các thông tin nhạy cảm như phiên đăng nhập, tuân thủ tiêu chuẩn bảo mật OWAPS
- javascript ko truy cập được nhưng vẫn có thể dùng cách khác để read cookie vd read thông qua api (chỉ document.cookie ko dc thôi còn câu lệnh khác vẫn dc)
- Secure: Chỉ HTTPS mới đọc hiểu được cookie (trừ trường hợp đặc biệt là localhost hoặc 127.0.0.1 thì vẫn đọc hiểu được)
- Same-Site:
- Strict: chặn ko cho gửi cookie mà request được gửi từ một bên thứ 3 (domain khác)
vd:- user A login vào Facebook (có cookie chứa info user đăng nhập), nhưng mà server Facebook lại setcookie = strict
- site taptanh.dev có link href trỏ qua facebook, thì khi click vào link href đó, sẽ trỏ qua trang facebook nhưng chưa login, do cookie chứa info user đăng nhập ko được gửi kèm (do gửi từ 1 bên thứ 3)
- Lax: chỉ cho gửi cookie mà request được send bằng method GET từ một bên thứ 3, các phương thức khác như POST, PUT, DELETE ko cho gửi vì đây là những phương thức làm thay đổi data
- giống vd trên, như do set same-site=lax nên cookie sẽ được gửi kèm, click vào link href trên (GET) khi trỏ qua facebook sẽ hiển thị info user sign in
- None: Cookie được gửi kể cả khi request được thực hiện từ trang web khác.
- Strict: chặn ko cho gửi cookie mà request được gửi từ một bên thứ 3 (domain khác)
⇒ Để hạn chế việc bị đánh cắp cookie, một số framework trong đó có rails có cơ chế regenerate value cookie ở mỗi request.
Session
Session được lưu ở phía server, tuỳ từng trường hợp use case cụ thể mà có thể lưu ở File, Database, Redis/Memcache (Redis/memcache thì lưu trên Ram, lưu trên Ram thì khi khởi động hay mất điện sẽ clear Ram, nên Redis/Memcache có cơ chế sync data với disk để restore lại data).
Session cần được set expire với giá trị ít nhất bằng với expire của cookie, để khi user ko chủ động logout (cơ chế logout sẽ chủ động clear cookie và session) mà user inspect clear cookie thì ở request tiếp theo, cookie sẽ mất kết nối tới session chứa cookie trên server nên sẽ ko rơi vào dòng code clear session được, nên ta cần phải set expire cho session để tự động clear session khi cookie mất kết nối tới session trên server.