간단한 인증페이지: PHP 기본 인증 코드로 인증 절차 만드는 방법 1가지

웹사이트 보안은 현대 인터넷 환경에서 매우 중요한 이슈로 자리 잡고 있습니다. 특히, 비교적 간단한 웹 프로젝트나 내부 관리 페이지 등을 운영할 때는 별도의 복잡한 인증 시스템을 구축하기보다는, 보다 빠르고 간편한 방식으로 사용자 인증을 구현할 필요가 있습니다. 이러한 경우, PHP에서 제공하는 HTTP 기본 인증(Basic Authentication)을 활용하면 손쉽게 인증 기능을 추가할 수 있습니다. 이번 포스트에서는 PHP를 이용한 HTTP 기본 인증 방식을 활용하여 간단한 인증 기능을 구현하는 방법을 살펴보고, 나아가 이를 다양한 웹사이트 페이지에 적용하는 방법에 대해 자세히 설명하겠습니다.

이번 포스팅은 지난 번에 작성한 보안페이지 만들기보다 조금 더 업그레이드 된 버전이라고 생각하면 됩니다.

간단한 인증페이지: PHP 기본 인증 코드로 인증 절차 만드는 방법 1가지 관련 이미지

 

소개

이 인증 코드는 다음과 같은 기능을 제공합니다:

HTTP 기본 인증:
사용자에게 브라우저 기본 인증창을 띄워 아이디와 비밀번호를 입력하도록 합니다.

IP 화이트리스트 지원:
미리 등록된 특정 IP(예: 관리자 IP)에서는 인증을 건너뛰어 편리하게 접근할 수 있도록 합니다.

해시 및 일반 텍스트 방식 선택:
보안을 강화하기 위해 해시된 비밀번호를 사용할 수 있으며, 간단하게 일반 텍스트 비밀번호로도 구현할 수 있습니다.

범용성:
복잡한 라이브러리나 데이터베이스 없이도 간단히 PHP 파일 상단에 삽입하여 사용할 수 있습니다.

 

코드 설명

아래는 전체 인증 코드 예시입니다. 이 코드를 PHP 페이지 상단에 삽입하면 해당 페이지 전체가 보호됩니다.

php

<?php
/**
* 간단한 인증 코드
* 
* 기능:
* - HTTP 기본 인증을 통해 관리자 접근을 제어합니다.
* - 허용된 IP 목록에 포함된 경우 인증을 생략합니다.
* - 해시/일반 텍스트 방식 중 선택하여 비밀번호 검증을 수행합니다.
*
* 사용법:
* 1. 이 파일의 코드를 복사하여, 인증이 필요한 PHP 페이지 상단에 삽입합니다.
* 2. 변수 $username, $hashed_password 또는 $plain_password를 원하는 값으로 설정합니다.
* 3. $allowed_ips 배열에 인증을 생략할 IP(예: 관리자 IP)를 추가합니다.
* 4. 필요에 따라 $use_hashed 값을 true(해시 사용) 또는 false(일반 텍스트 사용)로 설정합니다.
*/
ini_set('error_log', __DIR__ . '/error_log.txt'); // 에러 로그 파일 설정
// 실제 접속 IP 가져오기 (프록시 환경 고려)
$remote_ip = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
   $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
   $remote_ip = trim($ips[0]);
}
error_log("접속 IP: " . $remote_ip);
// 기본 인증 실패 시 처리 함수
function sendAuthHeaders() {
   header('WWW-Authenticate: Basic realm="Restricted Area"');
   header('HTTP/1.0 401 Unauthorized');
   echo '인증에 실패했습니다.';
   exit;
}
// 기본 인증 함수
function authenticate() {
   $username = 'admin';  // 관리자 아이디
   $use_hashed = false;  // false: 일반 텍스트, true: 해시 사용
   
   // 해시된 비밀번호 (해시 방식 사용 시)
   $hashed_password = '$2y$10$KznDev4mXieEGHADz/P76jh5Xd2ioCClTzXi';
   // 일반 텍스트 비밀번호 (일반 텍스트 방식 사용 시)
   $plain_password = '1234';
   
   if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
       sendAuthHeaders();
   }
   
   if ($_SERVER['PHP_AUTH_USER'] !== $username) {
       sendAuthHeaders();
   }
   
   if ($use_hashed) {
       if (!password_verify($_SERVER['PHP_AUTH_PW'], $hashed_password)) {
           sendAuthHeaders();
       }
   } else {
       if ($_SERVER['PHP_AUTH_PW'] !== $plain_password) {
           sendAuthHeaders();
       }
   }
}
// 허용된 IP 목록 (이 IP로 접속하면 인증창 없이 접근 가능)
$allowed_ips = ['211.100.65.88', '122.307.106.114'];
// IP 체크: 허용된 IP가 아니면 인증 진행
if (!in_array($remote_ip, $allowed_ips)) {
   authenticate();
}
// 인증 완료 후 계속 진행
// 여기서부터 보호하고자 하는 페이지의 내용을 작성합니다.
?>

 

코드 주요 포인트

에러 로그 설정:
ini_set()을 사용하여 현재 파일이 위치한 폴더에 error_log.txt에 디버깅 로그가 기록되도록 설정합니다.

실제 접속 IP 확인:
프록시 환경을 고려하여 HTTP_X_FORWARDED_FOR 헤더가 있을 경우 첫 번째 IP를 사용합니다.

인증 함수:
기본 인증 실패 시 HTTP 헤더를 전송하여 브라우저에 인증창이 뜨도록 하고, 올바른 아이디와 비밀번호가 입력되지 않으면 페이지 접근을 차단합니다.

IP 화이트리스트:
미리 정의한 IP 목록에 해당하는 경우, 인증을 건너뛰어 자동으로 페이지 접근을 허용합니다.

 

사용법

인증 코드 삽입

삽입 위치:
보호하려는 PHP 페이지의 맨 상단, HTML이나 다른 출력보다 앞에 삽입합니다.

설정 변경:
$username, $plain_password (또는 $hashed_password), $allowed_ips, 그리고 $use_hashed 값을 원하는 값으로 변경합니다.

확인:
페이지에 접속하여 올바른 IP 또는 인증 정보를 입력했을 때만 페이지 내용이 나타나는지 확인합니다.

 

다른 페이지에 동일하게 적용

이 코드를 복사하여 다른 PHP 페이지 상단에 삽입하면, 동일한 방식으로 인증을 적용할 수 있습니다. 범용 인증 코드이므로, 별도의 라이브러리 없이 간단하게 보안을 추가할 수 있습니다.