Nội dung bài viết
Video học lập trình mỗi ngày
Đăng nhập là chức năng thường được sử dụng trong mọi trang web hay những app hiện nay. Không khó để nhận ra vấn đề này đang được quan tâm nhất bởi vì lướt qua những page về lập trình như tips javascript, hay javascript Việt Nam đều thấy nhiều câu hỏi ở đó.
Thật sự bạn có biết khi enter thì cơ chế nó hoạt động như thế nào không? Và hiện nay, những ứng dụng lớn họ triển khai login như thế nào? Hôm nay chúng tôi sẽ giới thiệu một số phương pháp đăng nhập phổ biến nhất.
Lời nói đầu
Đăng nhập là chức năng thường được sử dụng trong mọi trang web, trên website hay app chúng ta cần nhập mật khẩu tài khoản và nhấn phím Enter để đăng nhập, bạn có biết nguyên tắc đăng nhập đằng sau điều này không? Hôm nay tips javascript sẽ giới thiệu 4 phương pháp đăng nhập phổ biến hiện nay và hầu như tất cả đều gói gọn trong 4 phương pháp này.
Bài viết này nằm trong series - cơ chế login
Phần 1 - 4 cơ chế đăng nhập, bài viết này là đủ cho dân lập trình
Phần 2 - Cơ chế đăng nhập với token hơn cookie và session như thế nào?
Phần 3 - Lập trình viên sớm muộn gì bạn cũng phải biết về cơ chế đăng nhập SSO (Single SignOn)
Phần 4 - OAuth 2.0 là gì? Tìm hiểu cơ chế và cách hoạt động đăng nhập
Và đầu tiên chúng tôi sẽ nói đến cơ chế xác thực sử dụng Cookie và Session.
Cookie, session login
Như mọi devjs đều biết HTTP là một giao thức không trạng thái. Mỗi khi client (máy khách) gửi yêu cầu, trước tiên nó sẽ thiết lập kết nối với server (máy chủ), sau đó ngắt kết nối sau khi yêu cầu hoàn tất. Phương pháp này có thể tiết kiệm tài nguyên kết nối bị chiếm dụng trong quá trình truyền, nhưng cũng có một vấn đề: mỗi yêu cầu là độc lập và server không thể xác định liệu yêu cầu này và yêu cầu trước đó có phải từ cùng một người dùng hay không và do đó không thể xác định người dùng là ai và từ đâu?.
Do đó để giải quyết vấn đề không trạng thái HTTP, Lou Montulli đã giới thiệu Cookie vào năm 1994. Và chúng ta xem tiếp theo Cookie là gì?
Cookie là gì?
Cookie là gì? Đặt câu hỏi cho vui vậy thôi chứ bài học lọt lòng đầu tiên của lập trình viên là những khái niệm này rồi. Nhưng tiện thể cũng nói sơ qua một chút, đỡ mất công Cookie là một phần thông tin đặc biệt do server gửi đến client, thông tin này được lưu trữ trong client dưới dạng văn bản. client sẽ mang thông tin đặc biệt này theo mỗi yêu cầu đến server.
Với cookie, server có thể lấy thông tin do client chuyển đến. Nếu thông tin cần được xác minh, Session phải được thông qua. client yêu cầu server và server sẽ mở ra một không gian bộ nhớ cho yêu cầu này. Đây là đối tượng Session. Và với Cookie và Session, chúng tôi có thể thực hiện xác thực đăng nhập.
Quy trình triển khai đăng nhập Cookie + session
Phương thức đăng nhập Cookie + Session là phương pháp đăng nhập cổ điển nhất và vẫn được một số lượng lớn các doanh nghiệp sử dụng. Khi người dùng đăng nhập lần đầu tiên thì chuyện gì sẽ xảy ra? Giả sử ta có mô hình sau.
- Người dùng truy cập anonystick.com/pageA và nhập mật khẩu để đăng nhập.
- Sau khi server xác minh rằng mật khẩu là chính xác, nó sẽ tạo một SessionId và lưu nó.
- server phản hồi yêu cầu HTTP này và ghi SessionId vào Cookie thông qua thông tin tiêu đề Set-Cookie.
Chú ý: SessionId ở phía server có thể được lưu trữ ở nhiều nơi, chẳng hạn như bộ nhớ, tệp, cơ sở dữ liệu, v.v.
Sau khi hoàn thành lần đăng nhập đầu tiên, những lần truy cập tiếp theo có thể sử dụng trực tiếp cookie để xác thực:
- Người dùng truy cập vào trang anonystick.com/pageB, nó sẽ tự động ghi lần đầu tiên để đăng nhập Cookie.
- server so sánh liệu SessionId trong Cookie có nhất quán với SessionId được lưu trữ trên server hay không.
- Nếu chúng nhất quán, xác thực thành công.
Nhược điểm khi đăng nhập với Cookie + Session
Mặc dù chúng tôi sử dụng Cookie + Session để hoàn tất xác minh đăng nhập, nhưng vẫn có một số vấn đề:
Vì server cần kết nối với một số lượng lớn client, nó cũng cần lưu trữ một số lượng lớn các SessionId, điều này sẽ gây ra áp lực server quá mức nhất là các dự án đang sử dụng PHP. Nếu server mà chúng ta đang triển khai dạng cluster (cụm), để đồng bộ hóa trạng thái đăng nhập, SessionId cần phải được đồng bộ hóa cho từng máy, điều này vô hình trung làm tăng chi phí bảo trì server.
Và một điều nữa trong phần này chúng ta muốn đề cập nhược điểm lớn nhất khi sử dụng đăng nhập theo SessionId được lưu trữ trong Cookie là không thể tránh được các cuộc tấn công CSRF mà có rất nhiều bài viết mổ xẻ về vấn đề này. Nếu các bạn quan tâm và muốn tìm hiểu thêm thì có click vào tìm kiếm về "Các hacker tấn công vào lỗ hổng CSRF như thế nào?".
Kết thúc phần này chúng ta có thể hiểu hơn về cơ chế login khi kết hợp session và cookie. Phần sau chúng ta sẽ nói đến cách thứ 2 đó chính là sử dụng token để login với nhiều các ứng dụng khác nhau. Đây là cách mà hệ sinh thái của Google đang triển khai.