My FeedDiscussionsHeadless CMS
New
Sign in
Log inSign up
Learn more about Hashnode Headless CMSHashnode Headless CMS
Collaborate seamlessly with Hashnode Headless CMS for Enterprise.
Upgrade ✨Learn more

So sánh giữa cookie vs token authentication

Đào Văn Đô's photo
Đào Văn Đô
·Jul 27, 2021·

7 min read

Ở bài trước mình đã có 1 bài viết về nội dung là : Phân biệt sự khác nhau giữa Authentication và Authorization. Bạn có thể đọc lại nó ở đây

Thì ở bài này thì mình sẽ cùng nhau đi tìm hiểu và so sánh được việc authentication bằng cookie với token.

image.png Ngày nay thì đa số các hệ thống sẽ áp dụng cách thứ 2 đó là authentication bằng Token-Base. Nhưng trước đó thì Cookie-Base cũng được sử dụng khá phổ biến.

Ở bài này mục đích của mình sẽ là chỉ tìm hiểu ở mức cơ bản, sẽ đưa ra những flow của chúng. Còn về chi tiết thì mọi người có thể tìm hiểu sâu hơn. Mình sẽ đưa ra cái nhìn tổng quan để mọi người biết và hình dung được việc authen bằng cả 2 hình thức. Còn về đi sâu chi tiết thì nó khá phức tạp, tại thời điểm mình viết bài này thì mức độ hiểu biết của mình chỉ ở mức cơ bản. Sau này nếu có hiểu biết nhiều hơn, sâu hơn thì mình sẽ chia sẻ nó ở một bài viết khác.

Flow làm việc của cookie vs token nhìn vào hình vẽ bên trên thì flow 2 thằng sẽ gần giống nhau. Ở đây mình sẽ có 2 phần đó là browser và server.

browser hay còn gọi là trình duyệt, là các ứng dụng mà bạn dùng để lướt web như chorme, coccoc… đóng vai trò là phía client. Đầu tiên khi mà bạn login vào 1 hệ thống, thì phía trình duyệt của bạn sẽ gửi lên server thông tin username và password bạn vừa nhập ở phía trình duyệt của bạn vào

image.png Ví dụ khi bạn login vào Facebook, thì bạn cần nhập thông tin username và password của bạn vào ô đăng nhập, sau đó khi bạn ấn button đăng nhập. Thì phía client sẽ gửi thông tin đó lên phía server để tiếp nhận và xử lý.

về phần phía server sau khi tiếp nhận được thông tin username và password, thì việc tiếp theo là phải check thông tin trong database để xem username và password có tồn tại trong hệ thống hay không. Sau đó trả lại kết quả cho phía client. Trong trường hợp mà thông tin username và password hợp lệ, thì phía server sẽ trả về cho client một thông tin nào đó (có thể là 1 đoạn token, hay 1 giá trị nào đó). Phía client sẽ lưu cái thông tin trả về đó lại và khi phía client muốn thực hiện 1 request đến server, thì client sẽ phải gửi kèm cái thông tin vừa lưu đó cùng với request lên server. Ví dụ 1 xíu cho dễ hình dung nhé, mọi người còn nhớ câu chuyện về bầy dê và con sói không. Khi mà dê mẹ đi ra khỏi nhà, thì bà đã để lại những thông tin và dấu hiệu chỉ có dê mẹ và dê con biết. Chỉ có ai biết và nắm được thông tin kí hiệu đó thì mới là dê mẹ. Con sói đã cố gắng vào nhà nhưng vì không biết được mật mã nên đã không thể vào được.

Ở đây việc vào nhà cũng như việc bạn truy cập vào bên trong hệ thống, chỉ có những người của hệ thống mới có và nắm giữ được thông tin từ phía server trả về. Từ thông tin đó thì hệ thống mới biết và nhận dạng được là user đó có đúng là của hệ thống mình không. Lúc đó mới cấp quyền cho truy cập hệ thống. Thì sau khi login thành công và nhận được thông tin từ phía server trả về, mỗi lần phía client request thì phải đính kèm thông tin đó theo. Phía server sẽ có nhiệm vụ là validate cái thông tin đính kèm đó. Nếu hợp lệ thì sẽ trả lại response cho phía client, còn trường hợp không hợp lệ thì sẽ không trả về dữ liệu. Với cái flow này thì cả 2 sẽ tương tự như nhau, nhưng cách thực hiện và triển khai sẽ khác nhau. Vậy cùng đi tìm hiểu xem chúng khác nhau như thế nào nhé.

1. Cookie Base

Đối với cookie base, khi bạn gửi thông tin username và password lên server thì server sẽ tạo ra 1 session, hay còn gọi là 1 phiên làm việc giữa client và server. Phía server sẽ lưu thông tin session đó vào trong database và sẽ set cookie ở phía client với thông tin session id chính là cái id vừa mới tạo ra. Điều này để giúp nhận ra được đây là phiên làm việc giữa client này và server. 1 server sẽ làm việc với rất nhiều client, mỗi client sẽ nắm giữ session và id khác nhau. Khi mà phía client đã có cookie lưu lại session rồi thì với mỗi lần thực hiện request, cookie sẽ gửi lên bao gồm cả thông tin session đến phía server. Phía server sẽ lấy ra thông tin session id đó và đem so sánh với database để xem session đó có hợp lệ hay không. Và để kiểm tra xem session đó thuộc user nào, user đấy có thông tin gì, có những quyền nào đối với hệ thống, được phép truy cập những tài nguyên nào. Từ đó sẽ trả ra response, còn đối với session k hợp lệ, thì sẽ k trả ra dữ liệu.

Điều mình nhận thấy ngay ở đây là gì, mỗi khi có client truy cập đến server, phía server sẽ phải tạo ra một session và phải lưu trữ nó lại trong database để kiểm tra và xử lý nó. Và mỗi 1 request, server sẽ lại phải lấy session id mà client gửi lên để query db xem session đó có hợp lệ hay không. Với số lượng client nhiều thì phía server sẽ phải lưu trữ và xử lý rất nhiều. Điều này làm giảm performance của hệ thống và tăng số lượng data mà hệ thống phải lưu trữ. Vì vậy mà cách authentication bằng Cookie Base ngày này không còn được sử dụng nhiều nữa. Thay vào đó là sẽ được thay thế bởi Token Base. Thì Token Base hoạt động như thế nào, và nó khắc phục nhược điểm của Cookie Base ra sao thì mình sẽ cùng đi tìm hiểu tiếp về Token Base.

2. Token Base.

Tương tự như với Token Base, việc authentication bằng Cookie Base thì bạn vẫn sẽ phải gửi lên username và password. Sau khi check rằng username và password hợp lệ, thì server sẽ tạo ra 1 token. Ở đây thì mình khuyến khích dùng JWT (Json Web Token, mình sẽ làm 1 bài khác nói rõ hơn về JWT). Hiểu đơn giản là server sẽ tạo ra 1 token, và token sẽ chứa các thông tin liên quan đến việc dùng để verify ví dụ như role của user… Thì phía trình duyệt sau khi nhận dc token này, sẽ lưu vào local storage. Và mỗi khi thực hiện 1 request, trình duyệt sẽ đính kèm cái token này vào cái header authorization và gửi ngược lại lên server. Lúc này nhiệm vụ của server là đi validate cái token này, xem token có hợp lệ hay không. Và nếu token bị sửa đổi ở phía client thì phía server sẽ phát hiện ra và token đó sẽ không còn hợp lệ. Cơ chế ra sao thì ở bài sau mình sẽ nói rõ. Và ok khi mà nó kiểm tra được rằng token này đã hợp lệ, thì lúc này nó sẽ coi đây là 1 request hợp lệ và sẽ trả ra dữ liệu. Ở đây khác với Cookie Base , thằng Token Base sẽ không phải lưu trữ, quản lý các token. Không phải query xuống database để kiểm tra token. Việc này giúp cho việc thực hiện request sẽ nhanh và đơn giản hơn nhiều. Giảm thiểu công việc khi phát triển hệ thống. Và khi logout, thì bạn phải gửi 1 yêu cầu để server nó xóa cái token đó đi. Điều này nhằm đảm bảo tính bảo mật, nếu không thì token vẫn còn hợp lệ.

Và sau đây mình sẽ tổng hợp lại một số điểm khác nhau giữa 2 cách authentication bên trên.

image.png Cảm ơn bạn đã theo dõi đến đây, mình mong rằng sau bài viết này. Bạn sẽ có 1 cái nhìn rõ hơn về việc authentication bằng Token Base và Cookie Base. Từ đó sẽ có lựa chọn hợp lý với hệ thống của mình.