認證和授權是安全驗證中的兩個重要概念。認證是確認身份的過程,用於建立雙方之間的信任關係。只有在認證成功的情況下,雙方才可以進行後續的授權操作。授權則是在認證的基礎上,確定使用者或系統對資源的存取許可權。
在設計一個許可權認證框架時,可以考慮以下原則:資源、角色和主體。
在開發中,可以採用前端頁面按鈕許可權控制和後臺統一許可權控制的方式來確保安全存取。前端頁面按鈕許可權控制可以根據使用者角色或許可權設定顯示或隱藏頁面上的按鈕,以限制使用者的操作。後臺統一許可權控制可以通過中介軟體或攔截器來驗證使用者的認證資訊和許可權,確保使用者只能存取其被授權的資源。
Cookie和Session是用於進行身份驗證和狀態管理的兩種機制,在實現上有一些區別。
Cookie是由伺服器在響應中生成並儲存在使用者端的一種小型文字檔案。它可以包含一些狀態資訊,例如使用者身份標識、過期時間等。每次使用者端傳送請求時,會自動攜帶相應的Cookie資料,以便伺服器進行身份驗證和狀態管理。
Session是在伺服器端建立和管理的一種資料結構,用於儲存每個使用者的對談資訊。伺服器在接收到使用者端請求後,為每個對談生成一個唯一的session id,並將其傳送給使用者端儲存。使用者端在後續的請求中會攜帶該session id,伺服器根據id查詢對應的對談資訊,進行身份驗證和狀態管理。
由於Session的實現依賴於Cookie來傳遞session id,如果沒有Cookie,無法將對談資訊與請求進行關聯,從而無法進行有效的身份驗證。
在分散式部署的情況下,可以採取一些解決方案來處理Session的資訊儲存問題。常見的解決方案包括:
CSRF(Cross-Site Request Forgery)攻擊是一種利用受害者在已經認證的狀態下執行非意願操作的攻擊方式。攻擊者通過誘使受害者存取惡意網站或點選惡意連結,來執行未經授權的操作,例如修改密碼、進行轉賬等,簡單來說就是,由於cookie是在瀏覽器共用的,所以一旦設定了cookie,那麼當你開啟另一個tab頁的時候,也會攜帶過去,那麼其他站點就可以使用cookie進行攻擊,具體如下:
比如:當你在瀏覽器中開啟銀行A的網頁併成功登入後,你想要進行轉賬操作。你使用GET請求存取了一個URL:https://www.banka.com/transfer?account=111&amount=1000。這個請求包含了轉賬所需的賬戶和金額資訊。
然而,同時你在另一個瀏覽器標籤中開啟了一個惡意網頁,這個網頁中包含了一個類似的URL:https://www.banka.com/transfer?account=111&amount=10000。由於你在之前登入銀行A的網頁時,瀏覽器會自動傳送之前的Cookie資訊,惡意網頁中的請求也會帶有相同的Cookie。
當你點選惡意網頁中的連結時,銀行A的伺服器會收到這個請求,並且由於存在有效的Cookie,會誤認為這是一個合法的請求,從而執行了轉賬操作,將10000的金額從你的賬戶中轉出。
為了防止CSRF攻擊,可以採取以下措施:
OAuth2.0是一種開放標準的授權協定,用於在第三方應用程式和服務之間進行安全的認證和授權。在OAuth2.0中,使用者可以通過授權伺服器將其身份驗證資訊與第三方應用程式共用。授權伺服器會頒發一個存取令牌,該令牌將用於向資源伺服器請求受保護資源。第三方應用程式使用存取令牌來獲取使用者授權的資源。
OAuth2.0的授權過程通常涉及以下幾個角色:
OAuth2.0有以下幾種認證方式:
授權碼模式(Authorization Code Grant):在這種模式下,使用者通過瀏覽器將自己的憑證(例如使用者名稱和密碼)提供給認證伺服器,然後獲取一個授權碼。授權碼隨後被用於交換存取令牌和重新整理令牌。
簡化模式(Implicit Grant):這種模式下,使用者在瀏覽器中直接發起認證請求,認證伺服器將令牌直接返回給瀏覽器,然後瀏覽器將令牌傳遞給第三方應用程式。第三方應用可以直接在前端頁面獲取存取令牌,而無需通過後臺進行回撥。
密碼模式(Resource Owner Password Credentials Grant):在這種模式下,使用者將自己的憑證直接提供給第三方應用程式,然後第三方應用程式使用這些憑證直接向認證伺服器請求令牌。
使用者端模式(Client Credentials Grant):這種模式下,第三方應用程式直接使用自己的憑證向認證伺服器請求令牌,而沒有使用者的參與。
JWT(JSON Web Token)令牌是一種輕量級的認證和授權機制,它是由一串經過Base64編碼的JSON資料組成的令牌。JWT令牌包含了使用者的身份資訊和許可權資訊,並且被數位簽章以確保其完整性和真實性。
在一般情況下,獲取的令牌token並沒有實際作用,它只是用來建立信任,使得第三方應用可以呼叫授權平臺的介面。然而,獲取使用者資訊介面通常成為一個瓶頸,因為第三方平臺需要獲取並儲存授權平臺的使用者基本資訊。與普通令牌不同,JWT令牌是通過加密生成的一系列資訊,第三方應用可以直接通過JWT令牌獲取使用者相關資訊,無需呼叫使用者基本資訊介面,從而減輕了使用者資訊介面的壓力。
SSO(Single Sign-On)是一種身份驗證和授權機制,它允許使用者在一次登入後存取多個相關應用系統而無需再次輸入憑證。SSO的目標是提供便捷的使用者體驗,減少使用者的登入負擔。
OAuth2.0是一種授權框架,它允許使用者授權第三方應用存取其受保護的資源,而無需將使用者名稱和密碼直接提供給第三方應用。OAuth2.0的主要目標是授權和保護使用者的資源,並確保使用者可以控制對其資源的存取許可權。
雖然SSO和OAuth2.0有相似的目標,都是為了提供使用者便利和安全的身份驗證和授權機制,但它們的實現和應用場景有所不同。SSO通常用於組織內部的應用系統,而OAuth2.0更多地用於第三方應用和開放平臺之間的授權。雖然OAuth2.0也可以用於實現SSO,但通常需要一個獨立的認證授權伺服器來處理認證和授權請求鏈路,以驗證使用者的登入資訊。
簡而言之,SSO強調的是一次登入,多個應用系統使用;而OAuth2.0強調的是一次註冊,多個應用系統授權存取。儘管OAuth2.0也可以用於實現SSO,但在實際應用中更常見的是將其用於第三方授權的場景。
以下是設計一個開放授權平臺的一些基本考慮點,具體的實現和架構會根據具體的需求和技術選型而有所不同。
總的來說,認證和授權是構建安全系統的重要組成部分。通過合理設計許可權認證框架,我們可以確保只有合法使用者能夠存取和執行相應的操作。在處理使用者身份認證時,Cookie和Session是常用的機制,但在分散式部署時需要注意Session的儲存和共用問題。此外,為了防止CSRF攻擊,我們可以採取一些措施,如使用CSRF令牌和驗證請求來源。最後,設計開放授權平臺時,需要考慮安全性、靈活性和易用性等因素。
最後,希望這篇安全驗證的內容對你的面試和工作有所幫助!同時,也歡迎你瀏覽整個專欄的其他內容,以獲取更多有用的資訊。