(역자주. HTTP authentication이란 Web Client에게 ID와 Password를 입력받아, 그 ID와 Password로 Web문서에 접근을 허가, 불허하는 기능을 말한다. 자세히 알고 싶다면 RFC1945의 Authentication 부분을 참고하기 바란다. http://pec.etri.re.kr/!qkim/HTTP/에 한글 번역 문서도 있으니 참조하자.)
PHP를 사용한 HTTP 인증은 Apache 모듈로 사용될 때만 동작한다. CGI 버젼에서는 이 기능을 사용할 수 없다. Apache 모듈의 PHP 스크립트에서 header()라는 함수를 사용하면 Client 브라우저에게 Username과 Password를 입력받는 윈도우를 띄우도록 하는 "인증 요구"("Authentication Required") 메시지를 보낼 수 있다. 일단 사용자가 Username과 Password를 입력하면, user name, password, authentication type의 값을 가지는 $PHP_AUTH_USER, $PHP_AUTH_PW, $PHP_AUTH_TYPE의 3개의 변수를 가지고 해당 URL(PHP 스크립트를 포함한)이 다시 불리워진다. 현재 authentication type은 "Basic"만이 지원된다. 자세한 사용법은 header() 함수를 살펴 보자.
client authentication을 사용하여 그 입력된 값을 출력하는 예제가 아래에 있다. :
여러분은 $PHP_AUTH_USER 와 $PHP_AUTH_PW를 단순히 출력하는 대신, 사용자의 식별을 위해 username과 password를 사용하기를 원할 것이다. 이때는 Database에 Query하거나 직접 dbm 파일에서 찾아보는 등의 방법으로 가능할 것이다.
Internet Explorer browser에서는 버그로 인해 Header의 순서가 매우 까다롭다. WWW-Authenticate를 HTTP/1.0 401보다 먼저 보내는 것이 현재 가능한 트릭으로 보인다.
비밀번호의 유출을 우려하여 HTTP에서 제공하는 인증을 사용하는 대신 기존의 외부 메카니즘을 사용할 경우에는 물론 PHP_AUTH 변수는 설정되지 않는다. 이런경우 externally-authenticated user를 확인하기 위해 $REMOTE_USER 변수를 사용할 수 있다.
유의할 점은 인증이 필요한 페이지와 인증이 필요없는 페이지가 같은 서버상에 존재할 때, 인증이 필요없는 URL을 control할 수 있는 누군가가, 인증이 필요한 URL의 암호를 훔쳐보는 것은 막을 수 없다는 점이다.
Netscape Navigator와 Internet Explorer 모두 401응답 코드를 서버에서 받게되면 local browser window의 authentication cache를 clear한다. 즉, 이것은 "log out"개념이 되는 것으로, 사용자들로 하여금 username과 암호를 다시 입력하게 한다. 일부는 이것을 통해 login의 "time out"이나 "log-out"버튼을 만드는데 사용한다
예 18-2. HTTP Authentication example forcing a new name/password
|
그러나 이 동작은 HTTP Basic authentication 기준에 보장된 것은 아니므로 이 기능에 의존하여서는 안된다. Lynx에서는 401 서버 응답을 받아도 authentication 정보를 초기화 하지 않는다. 따라서 Back을 누르고 다시 Forward 버튼을 눌러서 기존의 인증 정보를 가지고 다시 접근할 수 있다. 그리고 사용자가 '_'키를 눌러서 이 인증 정보를 삭제할 수도 있다.
또한 이 Authentication 기능은 Microsoft's IIS server에서 CGI version의 PHP를 사용할 경우에는 IIS의 제약으로인해 동작하지 않는다.