Giải ngố về cookies, session và cách duy trì đăng nhập khi tắt tab hoặc đóng cửa sổ .NET

238 lượt xem

Em vừa từ nhúng sang mảng web này thì khi tìm hiểu sâu vào bảo mật và xác thực có rất nhiều thứ khó hiểu cần chỉ dạy thêm :v Số là khi tìm hiểu về JWT thì em hiểu là khi user đăng nhập thì sẽ có 2 thứ được sinh ra là access token và refresh token. Sơ đồ nó sẽ là như này user ---------------------> server user <----access token ---- server refresh token Refresh token và access token sẽ được lưu vào cookies. Sau đó khi client gửi request yêu cầu truy cập vào các tài nguyên được bảo về như thông tin cá nhân thì access token sẽ được gửi kèm để chứng minh thân phận. Nếu access token hết hạn thì khi request sẽ gửi về lỗi 401, khi đó refresh token sẽ được gửi đi để request 1 access token mới. Tới đây thì em có vài thắc mắc. 1. Một vài trang (đa số) ghi cookies rằng chỉ tồn tại ở client side, nhưng trên trang của mozilla lại ghi là "The Set-Cookie HTTP response header is used to send a cookie from the server to the user agent, so that the user agent can send it back to the server later. To send multiple cookies, multiple Set-Cookie headers should be sent in the same response." Nên em khá là rối. 2. Ngoài cookies ra em cũng thấy có khá nhiều option khác như session storage, localStorage, SharedStorage, CacheStorage, thì thực tế thường là sẽ lưu ở đâu? Tại sao? Và việc lưu ở đâu là do mình quy định hay là browser (hay user-agent) sẽ quyết định ạ? Và nếu là mình quyết thì do server hay bên client sẽ làm điều đó? 3. Các thuộc tính của cookies như httpOnly, SameSite, Secure sẽ được set ở backend hay frontend ạ? 4. Bussiness logic như sau khi đăng nhập, tắt tab hoặc tắt window mở lại vẫn đang đăng nhập thì được xử lí như nào ạ? 5. Việc đính kèm header có kèm token xác thực thì browser sẽ tự làm hộ mình hay frontend phải làm? 6. Refresh token có cần thiết cho vấn đề duy trì đăng nhập không? Nếu không thì sẽ có những giải pháp nào ạ?

Đánh giá câu hỏi ngay!

Hãy ấn Up Vote với những câu hỏi cụ thể và chi tiết

Hãy ấn Down Vote với những câu hỏi chưa rõ ràng Careerly sẽ nhắc người hỏi chỉnh sửa lại.

2 câu trả lời

BEST

Ảnh đại diện của Kien Dinh

Giải ảo Token, Cookie và Request header Hi, câu trả lời của anh Minh khá ổn áp rồi, tuy nhiên mình vẫn muốn giải thích lại cho bạn dễ hiểu nhé. 🥑 Access token và Refresh toke Access token là token để authenticate, tuy nhiên thường vì lý do bảo mật, mà TTL (time-to-live) của loại token này sẽ được set khá ngắn (có khi 30 phút). Do vậy nên người ta áp dụng thêm Refresh token có TTL dài hơn để claim lại 1 access token mới. 🌀 Cookie có tồn tại ở Client hay cả Server? Cookie được sử dụng ở cả 2 phía, tuy nhiên ở phía client-side nếu chúng ta không chủ động chỉnh sửa nội dung cookie, thì việc này sẽ được thực hiện tự động. Thông thường các ứng dụng web truyền thống (không phải SPA) sẽ set cookie ở phía server (bằng key Set-Cookie) để truyền về cho client để xác thực người dùng. Lúc đó client không cần thực hiện hành động nào khi đăng nhập, bởi vì client sẽ lấy luôn cookie của request trước đó mà sử dụng cho các request tiếp theo. 💾 Lưu vào bộ nhớ nào của trình duyệt? Trình duyệt có các loại bộ nhớ khác nhau như Session storage, LocalStorage,… Mỗi loại có 1 đặc tính khác nhau, bạn lên mdn đọc sẽ thấy, và mình có thể tùy chọn sử dụng loại nào bằng javascript, tuy nhiên nếu dùng để lưu thông tin đăng nhập, thì lưu vào Cookie là ổn thỏa nhất. Còn local storage thường dùng để lưu thông tin dài hạn hơn. Tham khảo bài viết mình đính kèm phía dưới để biết tại sao lại như vậy. Về các thuộc tính sameSite, httpOnly thì sẽ set ở backend, trong bài viết phía dưới mình cũng đã đề cập luôn. Câu 4, 5, 6 thì đã được anh Minh trả lời rồi. 🖇️ Tham khảo: Bài viết: Authentication với JWT, lưu token ở đâu là bảo mật nhất? https://viblo.asia/p/authentication-voi-jwt-luu-token-o-dau-la-bao-mat-nhat-aNj4vz2v46r Nếu hữu ích, xin ủng hộ mình 1 upvote, hehe

Ảnh đại diện của Minh Monmen

Session, cookie và cách hoạt động của auth Chào supnep, các câu hỏi của bạn có phạm vi kiến thức khá rộng, nên mình sẽ chỉ tóm tắt và để bạn tự tìm hiểu thêm. 1. Cookie là bộ nhớ chỉ tồn tại ở client-side (tức là chỉ có client lưu lại cookie). Server có thể BẢO client lưu 1 giá trị vào cookie bằng việc trả về cái header 'Set-Cookie' khi client request. Việc lưu cookie gửi từ server và gửi kèm cookie trong các request tiếp theo được browser THỰC HIỆN TỰ ĐỘNG. 2. Các loại bộ nhớ trên là các bộ nhớ của browser, mỗi loại lại có 1 đặc điểm riêng. Bạn hãy xem định nghĩa của chúng để biết thêm chi tiết. Ví dụ Session Storage chỉ lưu data TRONG 1 TAB, tắt tab đó là mất, tạo tab mới thì tạo session storage mới,... Hoặc Local storage là bộ nhớ trên browser được share giữa các tab, không bị expire khi tắt tab,... Do đó lưu ở đâu thì là do bạn quyết định hết (tức là bạn chọn lưu cái gì, lưu ở đâu để đáp ứng nhu cầu). Ví dụ muốn lưu refresh token (là token lưu lâu dài) thì có thể lưu vào localstorage chẳng hạn. Việc lưu này chỉ có mỗi cookie là có thể có sự tham gia của server (qua response header) còn các loại storage khác đều là client tự dùng. 3. Trong 3 thuộc tính httpOnly, SameSite, Secure thì chỉ có httponly là bắt buộc phải set ở backend (vì thuộc tính này chặn code js dưới client access vào cookie này), còn 2 thằng kia có thể set được ở cả 2 nơi 4. Sau khi hiểu được các loại storage trên client thì bạn cũng trả lời dc câu hỏi này, lưu token vào cookie (có thời hạn) hoặc localstorage (không thời hạn),... đều giữ được phiên đăng nhập của user nếu tắt tab 5. Chỉ có duy nhất 1 nơi browser tự động gửi data kèm request là cookie. Nếu bạn set data vô cookie thì là tự động gửi, còn nếu dùng các loại storage khác thì bạn phải chủ động gửi kèm request thông qua header, query, body,... 6. Refresh token sinh ra để giải quyết vấn đề duy trì đăng nhập cho những loại access token ngắn hạn. Nếu access token của bạn dài hạn (mà không nên thế) thì không cần có refresh token lắm. Còn nếu ngắn hạn thì client phải lưu lại refresh token để lấy được access token mới khi hết hạn Bạn có thể tham khảo series này của mình về authentication để hiểu rõ hơn bản chất của việc đăng nhập với http: https://viblo.asia/s/authentication-story-jy5VB29V5ra

Đăng ký ngay bây giờ để đọc toàn bộ câu trả lời!

Cộng đồng lập trình viên sẽ giải đáp tường tận cho bạn.

Xem thêm

Đồng ý với Điều khoản dịch vụ Chính sách bảo mật của Careerly

Bạn đã có tài khoản rồi?

Đăng ký ngay bây giờ để đọc toàn bộ câu trả lời!

Cộng đồng lập trình viên sẽ giải đáp tường tận cho bạn.