Làm sao quản lý nhiều phiên đăng nhập khi viết scraper hoặc tool automation

Tool đăng nhập một tài khoản thì chạy ngon lành. Sang đến tài khoản thứ hai, thứ mười, mọi thứ bắt đầu rối: phiên đăng nhập đứng vào phiên của nhau, cookie lẫn lộn, trang web đăng xuất đúng lúc cần nhất, cứ hết hạn lại phải đăng nhập lại bằng tay. Vấn đề không nằm ở đoạn code đăng nhập, mà ở chỗ phiên đăng nhập là trạng thái , và trạng thái thì phải có chỗ để ở.

Bài này nói về cách tổ chức cái chỗ đó: phiên đăng nhập gồm những gì, các cách phổ biến để giữ chúng, và loại bẫy nào hay gặp khi nhiều phiên chạy song song.

Phiên đăng nhập thực chất là gì

Server không “nhớ” bạn đang là ai. Mỗi request, client phải mang theo thứ chứng minh mình: cookie phiên, token trong localStorage đối với SPA, hoặc header xác thực. Tất cả dữ liệu đó nằm ở phía client, tức là nằm trong trình duyệt. Hiểu được điều này thì cách quản lý phiên cũng tự nhiên ra: quản lý trình duyệt là quản lý phiên .

Một phiên không chỉ là chuỗi cookie: nó gồm cookie, localStorage, sessionStorage, cache, và cả fingerprint mà server dùng để nhận ra cùng một thiết bị. Về phần fingerprint tôi có viết một bài trước trên này, chỉ cần nhớ: đổi cookie mà đổi luôn cả thiết bị thì server hoài nghi.

Ba cách giữ phiên đang dùng phổ biến

1. Tự lưu cookie và gắn lại vào request

Cách cũ nhất: sau khi đăng nhập, lấy cookie, lưu vào file hoặc database, lần sau gắn lại. Nhẹ, dễ kiểm soát, nhưng vỡ ngay khi web dùng JavaScript set cookie, dùng localStorage, hoặc refresh token lặng. Phần lớn thời gian bảo trì cách này là xử lý phiên hết hạn.

2. Để trình duyệt tự giữ

Playwright và Selenium cho phép lưu storage state, tức là để browser tự mang theo cookie và storage giữa các lần chạy. Cách này bám sát hành vi người dùng thật, ít vỡ hơn. Nhược điểm là mỗi phiên song song tốn một browser context, vài chục phiên là máy bắt đầu thở hổn hển; can thiệp tay vào phiên đang lỗi cũng bất tiện.

3. Đem trạng thái đăng nhập ra khỏi máy chạy automation

Cách thứ ba tách biệt giữa chỗ chạy automation và chỗ cất phiên. Mỗi phiên sống trong một profile trình duyệt riêng: mở profile lên là đúng trạng thái đăng nhập cũ, đóng lại thì mọi thứ được giữ nguyên. Muốn khởi tạo nhanh thì import cookie có sẵn vào profile, khỏi phải đăng nhập tay từng cái; cần backup hoặc chuyển phiên sang máy khác thì export ra. Trên BitBrowser thì mỗi profile giữ độc lập cookie, storage và môi trường của nó, bản miễn phí cho 10 profile, đủ để thử cách tổ chức này; chi tiết thì mọi người xem trực tiếp trên site của họ. Đổi giữa các profile không đăng xuất lẫn nhau, đó mới là điểm khiến cách này khác hai cách trên.

Bẫy hay gặp khi chạy nhiều phiên

  • Token hết hạn lặng : access token sống vài phút, refresh token sống vài ngày. Tool chỉ ghép lại được phiên khi nó hiểu cơ chế refresh, không phải chỉ khi nó có cookie.

  • Xác minh lại bất chợt : OTP, captcha, mail xác minh xuất hiện giữa phiên chứ không phải lúc đăng nhập. Phiên nào không có người trực thì chết tại đó.

  • Đổi IP giữa chừng : phiên đăng nhập từ Hà Nội, request sau đó từ VPS nước ngoài, không ít hệ thống coi đây là dấu hiệu bất thường và buộc đăng nhập lại.

  • Nhầm phiên : hai chương trình dùng chung một profile, cái này đăng xuất thì cái kia mất phiên theo.

  • SPA không đặt cookie : phần lớn state nằm trong localStorage, cách chỉ copy cookie sẽ ra về tay trắng.

Cách tôi tổ chức hiện tại

Nguyên tắc: một tài khoản, một profile, một môi trường nhất quán. Đặt tên profile theo luật cố định, ghi rõ tài khoản, proxy và ngày tạo; đăng nhập xong thì gắn nhãn trạng thái ngay. Phiên dev tách khỏi phiên chạy thật, để thử nghiệm không phá dữ liệu đang dùng. Mỗi tuần kiểm một vòng, phiên chết thì ghi chép nguyên nhân, vì cùng một lỗi lặp lại sẽ cho biết vấn đề nằm ở cơ chế token của trang kia hay ở cách mình tổ chức.

Toàn bộ cách làm trên chỉ nên áp dụng cho hệ thống của bạn, hoặc hệ thống bạn có sự cho phép rõ ràng. Tự động hóa trên dịch vụ của người khác thì vẫn tuân theo điều khoản của họ, và quy định về tiếp thị cũng giới hạn cách được phép chạy quảng cáo bằng automation. Kỹ thuật là trung tính, cách dùng mới là chuyện cần cân nhắc.

Mọi người đang xử lý phiên đăng nhập cho nhiều tài khoản bằng cách nào, hoặc có case nào phiên chết liên tục mà không rõ nguyên nhân? Cứ ném lên đây, cùng mổ.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?