인터넷이 개발되면서 점점 더 많은 웹 사이트가 사용자 신원 확인 기능을 채택했습니다. 그러나 다른 웹 사이트에 로그인 할 때마다 계정과 비밀번호를 입력해야합니다.이 웹 사이트는 불편할뿐만 아니라 잊기 쉽습니다. 이 문제를 해결하기 위해 SSO (Single Sign-on)가 시작되었습니다. SSO는 사용자가 여러 웹 사이트간에 원활한 인증을 달성 할 수있는 기술이며 사용자는 로그인 한 번만 여러 사이트에 액세스 할 수 있습니다.
PHP SSO의 핵심 원칙은 사용자의 첫 번째 로그인이 성공한 후 토큰 (토큰)을 생성하고 사용자의 브라우저에 쿠키에 토큰을 저장하는 것입니다. 그 후 사용자가 다른 웹 사이트를 방문하면 웹 사이트는 SSO 서버에 요청을 보내 토큰을 확인하여 사용자의 신원을 확인합니다. 확인이 성공하면 SSO 서버는 사이트의 토큰을 발행하여 완벽하게 액세스 할 수 있습니다.
PHP SSO를 구현할 때 보안이 핵심 요소입니다. 몇 가지 안전 조치는 다음과 같습니다.
토큰을 생성 할 때는 토큰의 독창성을 보장하기 위해 강력한 무작위 숫자 생성 기능을 사용해야합니다. OpenSSL_RANDOM_PSEUDO_BYTES () 함수를 사용하여 안전한 랜덤 번호를 생성하고 Base64 인코딩을 통해 문자열로 변환하는 것이 좋습니다.
토큰은 암호화되어야하며 HTTPS 및 기타 보안 프로토콜을 사용하여 전송해야합니다. 토큰이 브라우저 쿠키에 저장되면, 악의적 인 스크립트에 의해 토큰이 검색되는 것을 방지하기 위해 Httponly 및 Secure 속성을 설정해야합니다.
토큰의 보안을 향상시키기 위해서는 토큰의 만료 시간이 만료 될 때 시간이 지남에 따라 파괴되어야합니다. 동시에, 만료에 가까울 때 토큰을 자동으로 새로 고칠 수 있도록 토큰 갱신 메커니즘을 구현하는 것이 좋습니다.
SSO는 사용자 경험을 향상시킬 수 있지만 몇 가지 안전 위험이 있습니다. 몇 가지 일반적인 취약점 및 예방 방법은 다음과 같습니다.
사용자가 로그인하면 시스템은 임의의 CSRF 토큰을 생성하여 세션에 저장해야합니다. 후속 요청 에서이 토큰은 요청의 정당성을 확인하기 위해 사용자 요청의 토큰과 비교해야합니다.
session_start();
function generateCSRFToken() {
$token = bin2hex(openssl_random_pseudo_bytes(32));
$_SESSION['csrf_token'] = $token;
return $token;
}
function validateCSRFToken($token) {
return isset($_SESSION['csrf_token']) && $_SESSION['csrf_token'] === $token;
}
악성 스크립트 주입을 방지하기 위해 시스템은 토큰을 HTML 페이지에 출력 할 때 HTML 탈출을 수행해야합니다. HTMLSpecialchars () 함수를 사용하여 XSS 공격을 방지하기 위해 토큰을 탈출하는 것이 좋습니다.
$token = generateCSRFToken();
echo htmlspecialchars($token, ENT_QUOTES, 'UTF-8');
토큰 자체 외에 토큰을 확인할 때 요청 된 IP 주소 및 사용자 에이전트 정보를 확인하여 합법적 인 사용자가 요청을 시작했는지 확인해야합니다.
function validateToken($token) {
return $token === $_SESSION['csrf_token'] &&
$_SERVER['REMOTE_ADDR'] === $_SESSION['ip'] &&
$_SERVER['HTTP_USER_AGENT'] === $_SESSION['user_agent'];
}
사용자에게 편리한 로그인 경험을 제공하는 동안 PHP SSO 단일 로그인 기술도 많은 보안 문제에 직면 해 있습니다. 토큰 생성, 스토리지, 전송 및 만료 관리의 보안을 강화하고 CSRF, XSS 및 세션 납치와 같은 취약성을 효과적으로 방지함으로써 SSO 시스템의 보안을 보장하여보다 안전하고 안정적인 로그인 서비스를 제공 할 수 있습니다.