인터넷의 발달과 함께 점점 더 많은 웹사이트와 애플리케이션이 사용자 로그인 기능을 사용하고 있으며, 가장 중요한 구현 방법 중 하나는 사용자 Single Sign-On(Single Sign-On, SSO라고도 함)입니다. 이 방법을 사용하면 사용자는 하나의 사이트나 애플리케이션에 로그인하기만 하면 해당 사이트나 애플리케이션과 관련된 여러 다른 사이트나 애플리케이션에 동시에 액세스할 수 있으므로 사용자 사용이 크게 간편해집니다.
이 글에서는 사용자 싱글 사인온(SSO)이 무엇인지, PHP 코드를 사용하여 구현하는 방법에 대해 설명하겠습니다.
사용자 싱글 사인온(SSO)은 사용자가 한 번의 로그인으로 여러 관련 사이트나 애플리케이션에 액세스할 수 있도록 하는 사용자 인증 방법입니다. 기존 로그인 방법에서는 사용자가 각 웹사이트나 애플리케이션에 대해 개별적으로 로그인해야 하며 일반적으로 사용자 이름과 비밀번호를 입력해야 합니다. 반면에 Single Sign-On은 여러 사이트나 응용 프로그램에서 로그인 정보를 공유할 수 있으므로 사용자가 한 사이트나 응용 프로그램에서 다른 사이트나 응용 프로그램으로 이동할 때 로그인 정보를 입력할 필요가 없습니다.
Single Sign-On을 통해 사용자 경험을 크게 향상할 수 있습니다. 이를 통해 모든 웹사이트나 애플리케이션에서 동일한 로그인 자격 증명을 입력하는 지루한 프로세스를 완화하는 동시에 특히 강력한 비밀번호를 사용하는 경우 보안을 향상하여 위험을 방지할 수 있습니다. 사용자가 취약하거나 동일한 비밀번호를 사용하여 발생합니다.
이제 간단한 예를 사용하여 PHP를 사용하여 사용자 싱글 사인온 기능을 구현하는 방법을 보여드리겠습니다. a.example.com과 b.example.com이라는 두 개의 웹사이트나 애플리케이션이 있는 시나리오를 생각해 보겠습니다. 우리는 사용자가 a.example.com을 방문한 후 다시 로그인하지 않고 b.example.com을 방문하기를 원합니다.
이 목표를 달성하기 위해 다음 측면부터 시작하겠습니다.
PHP에서는 $_SESSION
변수를 사용하여 사용자 관련 세션 정보를 저장할 수 있습니다. . 사용자가 a.example.com 사이트에 로그인하면 사용자의 인증 정보(예: 사용자 이름 및 비밀번호)를 a.example.com에 저장할 수 있을 뿐만 아니라 사용자가 볼 수 있는 페이지와 같은 기타 세션 데이터도 저장할 수 있습니다. 액세스 및 기타 권한 등 $_SESSION
变量来存储用户相关的会话信息。当用户在站点 a.example.com 中登录时,我们可以在 a.example.com 中保存用户的身份验证信息(例如用户名和密码),以及一些其他的会话数据,如用户能访问的页面、其权限等等。
而为了让用户无需重新登录即可访问 b.example.com,我们需要共享从 a.example.com 检索到的 Session 数据。要实现这一点,我们需要在两个站点的 php.ini
文件中设置 session.cookie_domain
为主域名(即 example.com
),这样就保证了在两个站点中使用的 Session ID 都是相同的。同时,我们还需要在两个站点中使用相同的 Session 存储机制,如 MySQL 或 Redis。
为了让用户从站点 a.example.com 转移到 b.example.com,我们需要使用 PHP 中的 header
函数来进行跨站点重定向。
在 a.example.com 中进行登录之后,我们将会跳转到 b.example.com。而为了保证用户无需输入登录凭据即可访问 b.example.com,我们需要使用 URL 参数来向 b.example.com 传递 Session ID,这样 b.example.com 就可以通过该 Session ID 检索到与该用户相关的 Session 数据。
具体来说,我们可以获取当前用户 Session ID,并将其作为 URL 参数传递到 b.example.com,代码如下所示:
session_start(); $session_id = session_id(); $url = "https://b.example.com/login.php?session_id=" . $session_id; header("Location: $url");
该代码会将用户重定向到 b.example.com 的 login.php 页面,并在 URL 参数中传递 Session ID。
而在 b.example.com 的 login.php
页面中,则需要检查 URL 参数中的 Session ID,并使用该 Session ID 检索到与该用户相关的 Session 数据。如果检索到了相关的数据,则将用户标记为已登录状态。代码如下所示:
session_id($_GET['session_id']); session_start(); // 检查该 Session ID 是否存在对应用户的 Session 数据 if (isset($_SESSION['user_id'])) { $_SESSION['logged_in'] = true; // 标识用户已经登录 }
除了跨站点登录之外,我们还需要考虑跨站点注销。跨站点注销通常需要包括以下几个步骤:
对于步骤 2,我们只需要调用 session_destroy()
php.ini
파일에서 session.cookie_domain
을 기본 도메인 이름(예: example.com
)으로 설정해야 합니다. 두 사이트 모두), 두 사이트 모두에서 사용되는 세션 ID가 동일하도록 보장합니다. 동시에 두 사이트 모두에서 MySQL 또는 Redis와 같은 동일한 세션 저장 메커니즘을 사용해야 합니다. 2. 사이트 간 리디렉션사용자를 a.example.com 사이트에서 b.example.com으로 이동하려면 사이트 간 리디렉션을 위해 PHP의 header
함수를 사용해야 합니다. . 🎜🎜a.example.com에 로그인한 후 b.example.com으로 이동합니다. 사용자가 로그인 자격 증명을 입력하지 않고도 b.example.com에 액세스할 수 있도록 하려면 b.example.com이 사용자와 관련된 정보를 검색할 수 있도록 URL 매개변수를 사용하여 세션 ID를 b.example.com에 전달해야 합니다. 세션 ID를 통해. 🎜🎜구체적으로 현재 사용자 세션 ID를 가져와 b.example.com에 URL 매개변수로 전달할 수 있습니다. 코드는 다음과 같습니다. 🎜$user_id = 123; $request_url = "https://b.example.com/logout.php"; $ch = curl_init($request_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, array('user_id' => $user_id)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch);
login.php
페이지에서 URL 매개변수의 세션 ID를 확인하고, 세션 ID를 사용하여 사용자와 관련된 세션 데이터를 검색해야 합니다. 관련 데이터가 검색되면 사용자가 로그인된 것으로 표시됩니다. 코드는 다음과 같습니다: 🎜session_start(); session_destroy();
session_destroy()
함수를 호출하여 현재 사용자와 관련된 모든 세션 데이터를 삭제하면 됩니다. 그러면 사용자는 현재 세션에서 로그아웃됩니다. 사이트. 🎜🎜3단계에서는 PHP의 cURL 기능을 사용하여 다른 사이트에 로그아웃 요청을 보낼 수 있습니다. 예를 들어, 로그아웃한 사용자의 ID와 같은 정보가 포함된 POST 요청을 b.example.com으로 보낼 수 있습니다. 코드는 다음과 같습니다. 🎜rrreee🎜4단계에서는 이전과 마찬가지로 각 사이트의 세션 데이터를 삭제하는 동일한 코드를 구현해야 합니다. 예를 들어 b.example.com에서는 현재 사용자와 관련된 세션 데이터를 삭제하기 위해 다음 코드를 작성할 수 있습니다. 🎜session_start(); session_destroy();
由于跨站点登录的特殊性,它会导致被恶意利用以进行跨站点会话劫持。攻击者可以通过某种方式获得受害者生成的 Session ID,然后将该 Session ID 用于攻击者自己的会话中,以此来获取受害者的权限。
为了防止这种情况的发生,我们可以使用以下几种方式来提高安全性:
session_regenerate_id()
函数定期更新 Session ID,从而减小攻击者获取当前会话 ID 的可能性。在本文中,我们介绍了用户单点登录(SSO)的含义和意义,并使用 PHP 代码演示了如何实现基本的 SSO 方案。通过单点登录,可以提高用户在网站或应用程序间的使用体验,同时也能够提高安全性。而为了确保安全性,我们还需要在保证使用方便的基础上,考虑到跨站点会话劫持等安全风险,采取相应的安全措施。相信本文对于正在考虑或正在使用用户单点登录的 PHP 开发人员来说,会有所帮助。
위 내용은 PHP는 사용자 싱글 사인온(SSO)을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!