2010-05-06 3 views
1

웹 응용 프로그램 인증의 전체 세부 정보를 배우고 싶습니다. 그래서, 나는 처음부터 CodeIgniter 인증 라이브러리를 작성하기로 결정했습니다. 이제는 한 명의 사용자가 로그인했는지 여부를 결정하는 방법에 대한 디자인을 결정해야합니다.사용자가 웹 응용 프로그램에 로그인했는지 확인하는 방법은 무엇입니까?

기본적으로 사용자 입력 후 사용자 이름 & 암호 쌍. 웹 응용 프로그램의 탐색에 사용자 이름 & 암호가 필요하지 않으면이 세션에 쿠키가 설정됩니다. 서버 측은 세션 쿠키가 현재 사용자가 로그인 상태인지 여부를 확인하는 데 유효한 지 여부를 확인합니다. 질문 : 쿠키가 서버 측에서 발급 된 유효한 쿠키인지 여부를 확인하는 방법은 무엇입니까?

가장 간단한 방법은 세션 값에도 쿠키 값을 저장하는 것입니다. 각 HTTP 요청에 대해 쿠키의 값과 서버 세션의 값을 비교합니다. (CodeIgniter 세션 라이브러리는 쿠키에 세션 변수를 저장하기 때문에, 약간의 변경 없이는 적용 할 수 없습니다.)이 방법을 사용하려면 서버 측에 스토리지가 필요합니다.

여러 데이터 센터에 배포 된 거대한 웹 응용 프로그램의 경우. 나중에 다른 데이터 센터에서 웹 응용 프로그램에 액세스하는 동안 한 데이터 센터에서 검색 할 때 사용자 입력 사용자 이름이 & 일 수 있습니다. 예상되는 동작은 사용자가 사용자 이름 & 암호를 한 번만 입력한다는 것입니다. 결과적으로 모든 데이터 센터는 세션 상태에 액세스 할 수 있어야합니다. 세션 상태가 데이터베이스와 같은 외부 저장소에 저장되어 있어도 적용 할 수 없습니다.

Google을 사용해 보았습니다. 아시아 지역의 데이터 센터로 연결되는 아시아 프록시가있는 Google에 로그인합니다. 그런 다음 북미 대리점으로 이동하여 북미 지역의 데이터 센터로 이동시켜야합니다. 그것은 사용자 이름과 암호를 다시 묻지 않고 내 로그인을 인식합니다.

그래서 사용자가 서버 쪽 세션 상태없이 로그인했는지 확인할 수있는 방법이 있습니까?

답변

1

아니요, 불가능합니다.
이러한 데이터 센터는 서로 격리되어 있지 않고 상호 연결되어 있습니다.
데이터베이스와 같이 고체이지만 "외부 저장"

도메인 간 인증은 다른 문제이지만 쉽게 달성됩니다.

어쨌든 이러한 정보의 용도는 무엇입니까? - 사용자가 로그인했는지, 사용자 옵션이 없는지, 자격 증명 - 아무거나? 서버 측에 데이터베이스가없는 이유는 무엇입니까?

+0

Google에서 모든 데이터 센터에 대해 전체적으로 액세스 할 수있는 세션 저장소를 보유하게 될 것입니까? 서버 측은 일반적으로 사용자가 로그인되어 있는지 확인합니다. 사용자 행동을 진행할지 또는 로그인 페이지로 리디렉션 할지를 결정합니다. 실생활에서는 사용자 옵션이 세션에도로드 될 것이라고 생각합니다. –

+0

@Morgan 그럼 사용자가 로그인했음을 결정했습니다. 다음은 무엇입니까? "세션"에서 당신은 무엇을 의미합니까? 동일한 글로벌 데이터베이스가 아닌가? –

+0

로그인 한 사용자의 세션 데이터에는 일반적으로 세션 당 정보 (예 : 로그인 시간)와 자주 사용되는 정보 (예 : 사용자 환경 설정)가 있다고 가정합니다. 이 정보는 전 세계적으로 액세스 할 수 있어야합니다. –

1

유용한 자원 :

  • session_save_handler는 예를 들어, 자신의 메커니즘에 의해 PHP의 파일 기반 세션 처리를 대체 할 수 있습니다 외부 데이터베이스에 연결

  • this SO question은 mySQL 복제를 처리합니다.

이것은 PHP 솔루션으로 멀티 서버로 전환 할 때 많은 문제 중 하나입니다. SO 검색에서 주제를 더 찾을 수있을 것입니다.

또한 서버 오류에 대해 살펴보십시오.

1

과 같은 것으로 세션 쿠키와 비슷한 것으로 사용자가 인증되었다고 가정하면 매우 나쁜 생각입니다. 또한 session_start()를 먼저 호출하지 않고 세션에 대한 사실을 측정하기 시작할 때 코드가 매우 복잡해질 것입니다. 더 나은 해결책은 사용자가 인증 된 사실 (및 잠재적으로 인증 정보의 일부)을 세션 itelf에 저장하는 것입니다.

session_start(); 
if (!$_SESSION['auth_user']) { 
    if ($_POST['username'] && $_POST['password'] 
     && check_valid($_POST['username'],$_POST['password']) { 
      $_SESSION['auth_user']=$_POST['username']; 
     } else { 
      // user is not logged in 
      header('Location: /login.php'); 
      print 'You are not logged in'; 
      exit; 
     } 
} 

C.

0

따라서, 사용자가 서버 측 세션 상태없이 로그인 여부를 확인하는 방법은 없나요?

예, 있습니다. 서버는 암호화 된 사용자 ID (및 가능하면 다른 데이터)로 쿠키를 설정해야합니다. 모든 서버가 키를 공유하면 쿠키를 해독하는 방법도 알기 때문에 사용자를 독립적으로 인증 할 수 있습니다. 쿠키에 암호화되지 않은 사용자 ID가 포함되어 있으면 맞춤 단방향 암호화 기능 (일명 해시 염 또는 MAC)을 사용하여 유효한지 확인할 수 있습니다. 정말로 보안에 관심이 있다면 더 많은 데이터를 암호화 할 수 있습니다. IP 주소, 만료일 등 원하는 경우 공개 키 및 개인 키 및/또는 디지털 서명과 함께 비대칭 암호화를 사용할 수도 있습니다.

+0

쿠키에 서명하는 것으로 충분하지 않습니까? – alapeno

+0

예, 이것 역시 언급했습니다. – Adam

관련 문제