Avatar
1
Lâm Văn Đời Beginner
Session + Cookie và JWT
Xin chào mọi người, theo em được biết thì với các Monolithic application thì thường dùng Session(Cookie) để xác thực.

Em có 2 câu hỏi muốn hỏi là :

  1. Đối với combo các ứng dụng SPA + App mobile  dùng chung 1 Backend (Microservice) thì tại sao ở phần xác thực các ứng dụng thường dùng JWT thay vì dùng Session(Cookie) vậy ạ ? Ưu/Nhược điểm giữa chúng là gì ạ ?
  2. Trên thực tế thì có thể dùng Session(Cookie)  cho chức năng xác thực hay bất cứ chức năng nào cho hệ thống Microservice được không ạ?
  3. Có phải Session(Cookie) chỉ nên được sử dụng cho Monolithic application không ạ ? (lý do em hỏi câu này là do các ứng dụng Microservice thì thường deploy trên nhiều instance thay vì 1 instance như Monolithic application mà Session thì lưu trên memory server nên em đoán sẽ không ổn cho lắm đúng ko ạ ? )
  • Answer
jwt session cookie
Remain: 5
1 Answer
Avatar
monkey Beginner
monkey Beginner
  1. Session là một đối tượng đại diện cho user, được lưu cache trong server của em, điều này giúp cho việc xác thực hoặc lấy dữ liệu của user nhanh hơn, bởi vì HTTP là giao thức ngắt kết nối nên nếu mỗi lần client gọi lên server là 1 lần phải xác thực lại, nếu không có session lưu map sẵn với token thì sẽ phải vào db lấy, dẫn đến bị chậm.

Trong môi trường microservice thì sẽ có nhiều server, cũng vẫn có thể sử dụng được session tuy nhiên sẽ phức tạp hơn, giả sử user cần logout khỏi tất cả các thiết bị thì nếu chỉ có server thì chỉ cần xoá cái session là xong, nhưng trong môi trường nhiều server thì lại phải thông qua Kafka hoặc MQ để từ cái server nhận được request logout sẽ phải thông báo cho tất cả server còn lại để xoá session, và thực tế thì lưu session cũng sẽ tốn bộ nhớ nữa, cứ giả sử 1 session sẽ tống 1KB thì 1 triệu session sẽ mất 1GB.

Nếu sử dụng jwt token thì sẽ không cần dùng đến session nữa, vì jwt có thể lưu được thông tin user như userId, username, email và xác thực thông qua chữ ký số. Và khi user gửi token lên server thì không cần phải vào DB để lấy các thông tin như userId nữa vì trong token đã có luôn rồi. Tuy nhiên có 1 nhược điểm là jwt nó bị fix thông tin, nghĩa là giải sử token lưu là hết hạn vào ngày xyz thì server sẽ phải chấp nhận ngày này, thêm 1 nhược điểm nữa đó là do được ký và xác thực bởi server, nên 1 khi bị lộ public key (ví dụ ai đó trong đội DevOps nghỉ việc và copy theo) thì hoàn toàn có thể làm giả được jwt token.

  1. Session có thể lưu các thông tin như token, userId, username, ... Khi user gửi request lên server thì sẽ kiểm tra xem có session nào được map với cái token không thì tạo mới, dẫn đến chỉ cần truy xuất DB lần đầu khi session chưa được tạo, như vậy cho dù là mono hay microservice thì cũng đều dùng session để lưu thông tin xác thực được.

  1. Như đã giải thích ở trên, là việc sử dụng session trong microservice là hoàn toàn khả thì, có điều sẽ phức tạp 1 chút khi cần đồng bộ hoặc xoá bỏ session trên tất cả server, và việc lưu trữ trên mem thực tế cũng không phải vấn đề gì quá lớn, với 1 triệu user đang active thì em cũng đủ giàu để thuê 1 con server hàng chục GB Ram rồi em ạ.
  • 0
  • Reply