ServBay에서 PHP OpenLDAP 확장 사용하기
ServBay는 다양한 기술 스택을 지원하는 강력한 로컬 웹 개발 환경입니다. LDAP(경량 디렉터리 액세스 프로토콜) 서버와 상호 작용이 필요한 PHP 애플리케이션 개발자를 위해, ServBay는 PHP의 OpenLDAP 확장 기능을 기본 제공하여 손쉽게 활성화하고 사용할 수 있게 해줍니다. 이 문서는 ServBay 환경에서 이 확장 기능을 이용해 사용자 인증, 디렉터리 검색 등의 기능을 구현하는 방법을 안내합니다.
OpenLDAP와 PHP OpenLDAP 확장이란?
OpenLDAP는 LDAP 프로토콜 기반의 디렉터리 서비스를 제공하는 널리 사용되는 오픈소스 구현체입니다. LDAP 프로토콜은 분산 디렉터리 정보 서비스를 접근하고 관리하는 애플리케이션 프로토콜로, 기업 환경에서 사용자 인증, 조직 구조 관리, 주소록 서비스 등에 많이 활용됩니다.
PHP OpenLDAP 확장(일반적으로 ldap
확장으로 불림)은 PHP가 LDAP 서버와 통신할 수 있도록 함수 라이브러리를 제공하는 PHP의 모듈입니다. 이 확장을 통해 PHP 애플리케이션은 LDAP 서버에 연결하여 인증(바인딩), 검색, 추가, 수정, 삭제 등의 디렉터리 작업을 실행할 수 있습니다.
ServBay에서는 PHP에 내장된 OpenLDAP 클라이언트 확장이 주요 관심 포인트입니다. 이 확장은 여러분의 PHP 코드가 외부 LDAP 서버에 연결하고 조작할 수 있게 해줍니다. 참고로, ServBay 자체에는 OpenLDAP 서버가 포함되어 있지 않습니다.
PHP OpenLDAP 확장 주요 기능
PHP OpenLDAP 확장을 통해 다음과 같은 작업이 가능합니다.
- LDAP 서버 연결: 지정한 LDAP 서버에 연결합니다.
- 바인딩 작업 수행: 익명 바인딩 또는 DN(Distinguished Name)과 비밀번호를 통한 인증 바인딩을 수행합니다.
- 디렉터리 검색: 필터, 검색 기준 및 범위에 따라 디렉터리 내 엔트리를 검색합니다.
- 엔트리 정보 읽기: 검색 결과의 각 엔트리 속성과 값을 가져옵니다.
- 수정 작업 수행: 새로운 엔트리 추가, 엔트리 삭제, 속성 수정 등을 처리합니다.
- LDAP 오류 처리: 작업 실패 시 오류 정보를 확인합니다.
ServBay에서 PHP OpenLDAP 확장 버전 호환성
ServBay는 여러 PHP 버전을 설치 및 실행할 수 있도록 지원합니다. PHP OpenLDAP 확장은 일반적으로 공식 PHP 배포판의 일부로 제공되며, ServBay에서 빌드된 PHP 패키지에도 기본 포함되어 있습니다. 즉, ServBay 내 PHP 버전을 사용하면 대부분의 경우 별도 설치 없이 OpenLDAP 확장을 사용할 수 있습니다.
PHP OpenLDAP 확장 활성화 여부 확인 방법
ServBay는 대개 많이 쓰이는 확장 기능을 기본 활성화해 두지만, 확장 상태를 직접 확인하는 습관을 들이는 것이 좋습니다. 가장 간단한 방법은 phpinfo()
함수를 사용하는 것입니다.
ServBay 사이트의 루트 디렉토리(기본값:
/Applications/ServBay/www
)에 예를 들어info.php
라는 새 PHP 파일을 만듭니다.아래의 내용을
info.php
파일에 추가합니다:php<?php phpinfo(); ?>
1
2
3브라우저에서 ServBay 내 해당 파일과 연동된 사이트 주소(예:
http://servbay.demo/info.php
)로 접속합니다.표시된
phpinfo()
페이지에서ldap
섹션을 찾아봅니다.ldap
섹션이 존재하고 그 안에 (LDAP Support enabled
등) 설정 정보가 표시된다면, PHP OpenLDAP 확장이 성공적으로 로드되고 활성화된 상태입니다.
만약 ldap
섹션이 없거나 LDAP Support
가 비활성(disabled)로 표시된다면, 해당 PHP 버전의 빌드 설정을 확인하거나 ServBay 지원팀에 문의해 보세요. 대부분의 경우, 확장은 기본 활성화되어 있습니다.
PHP 코드에서 OpenLDAP 사용하기
OpenLDAP 확장의 활성화를 확인했다면, 이제 PHP 애플리케이션에서 ldap_*
함수 시리즈를 활용해 LDAP 서버와 상호작용할 수 있습니다. 아래는 LDAP 서버에 연결하고, 관리자 계정으로 바인딩한 뒤, 사용자를 검색하고 인증하는 과정을 보여주는 기본 예제입니다.
중요 참고: 아래 예제 코드의 LDAP 서버 주소, 포트, 관리자 DN, 비밀번호, 검색 기준, 사용자 필터, 사용자 비밀번호 등은 모두 플레이스홀더입니다. 실제 적용 시에는 여러분이 사용할 LDAP 서버의 정확한 환경과 인증 정보를 반드시 적용해야 하며, 실환경에서는 코드 내에 비밀번호 등 민감 정보를 하드코딩하지 않도록 주의하세요.
예제 코드: 기본 연결, 검색 및 인증
아래 코드를 ServBay 사이트 디렉토리에 ldap_test.php
와 같이 저장한 후, 브라우저에서 실행하면 결과를 확인할 수 있습니다.
php
<?php
// --- LDAP 연결 설정 ---
// 자신의 LDAP 서버 주소로 변경하세요. LDAPS(SSL/TLS) 사용 시 ldaps:// 접두사를 쓰고 기본 포트는 636입니다.
$ldapURI = "ldap://ldap.example.com:389";
// LDAP 관리자의 DN(Distinguished Name) 또는 검색 권한이 있는 사용자의 DN으로 변경
$ldapAdminRdn = "cn=admin,dc=example,dc=com";
// 위 DN에 해당하는 관리자 비밀번호로 변경
$ldapAdminPassword = "admin_password";
// --- 사용자 검색 및 인증 설정 ---
// 자신의 LDAP 디렉터리 내 사용자 기준 DN으로 변경
$searchBase = "dc=example,dc=com";
// 특정 사용자를 검색할 필터로 변경. 예시: uid가 'servbay-demo'인 사용자 검색
$searchFilter = "(uid=servbay-demo)";
// 인증하려는 사용자의 비밀번호로 변경
$userPasswordToAuthenticate = "user_password_for_servbay_demo";
echo "<h2>ServBay에서 PHP OpenLDAP 예제</h2>";
// 1. LDAP 서버 연결 시도
echo "<p>LDAP 서버에 연결 시도: {$ldapURI}...</p>";
$ldapConn = ldap_connect($ldapURI);
if (!$ldapConn) {
die("<p style='color: red;'>오류: LDAP 서버에 연결할 수 없습니다.</p>");
}
echo "<p style='color: green;'>LDAP 서버에 성공적으로 연결되었습니다.</p>";
// LDAP 옵션(프로토콜 버전 및 referrals 비활성화) 설정 권장
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
// 2. 관리자 인증(DN) 바인딩 시도 (검색 등 권한 필요한 작업용)
echo "<p>관리자 DN '{$ldapAdminRdn}'으로 바인딩 시도...</p>";
if (!ldap_bind($ldapConn, $ldapAdminRdn, $ldapAdminPassword)) {
echo "<p style='color: red;'>오류: 관리자 바인딩 실패.</p>";
echo "<p style='color: red;'>LDAP 오류: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // 연결 종료
die();
}
echo "<p style='color: green;'>관리자 바인딩 성공.</p>";
// 3. 사용자 검색
echo "<p>기준 DN '{$searchBase}'에서 필터 '{$searchFilter}'로 사용자 검색 시도...</p>";
$searchResult = ldap_search($ldapConn, $searchBase, $searchFilter);
if (!$searchResult) {
echo "<p style='color: red;'>오류: LDAP 검색 실패.</p>";
echo "<p style='color: red;'>LDAP 오류: " . ldap_error($ldapConn) . "</p>";
ldap_unbind($ldapConn); // 연결 종료
die();
}
echo "<p style='color: green;'>검색 성공.</p>";
// 4. 검색 결과 수집
$entries = ldap_get_entries($ldapConn, $searchResult);
if ($entries["count"] > 0) {
echo "<p>{$entries["count"]}개의 일치하는 엔트리를 찾았습니다.</p>";
// 첫 번째 일치 사용자만 사용
$userDn = $entries[0]["dn"];
echo "<p>첫 번째 일치 사용자 DN: <strong>{$userDn}</strong></p>";
// 5. 찾은 사용자 DN과 비밀번호로 인증 바인딩 시도
echo "<p>사용자 DN '{$userDn}'으로 인증 바인딩 시도...</p>";
// 주의: 이 부분은 관리자 바인딩이 아니라 사용자 인증 바인딩입니다.
if (@ldap_bind($ldapConn, $userDn, $userPasswordToAuthenticate)) {
echo "<p style='color: green;'>사용자 인증 성공!</p>";
} else {
echo "<p style='color: red;'>사용자 인증 실패.</p>";
echo "<p style='color: red;'>LDAP 오류: " . ldap_error($ldapConn) . "</p>";
}
} else {
echo "<p>필터 '{$searchFilter}'에 일치하는 사용자를 찾지 못했습니다.</p>";
}
// 6. LDAP 연결 해제
echo "<p>LDAP 연결 해제 중...</p>";
ldap_unbind($ldapConn);
echo "<p style='color: green;'>연결이 종료되었습니다.</p>";
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
코드 설명
- 연결(
ldap_connect
): LDAP 서버와 연결을 설정합니다. 연결 식별자를 반환합니다. - 옵션 설정(
ldap_set_option
): 연결 설정 제어.LDAP_OPT_PROTOCOL_VERSION, 3
은 LDAPv3 프로토콜을 사용하도록 지정합니다(권장).LDAP_OPT_REFERRALS, 0
은 referrals 기능을 끕니다(단순 앱에서 권장). - 바인딩(
ldap_bind
): LDAP 서버 인증.- 익명 바인딩:
ldap_bind($ldapConn)
— DN과 비밀번호 없이 바인딩(권한 제한 큼). - 인증 바인딩:
ldap_bind($ldapConn, $dn, $password)
— 지정한 DN과 비밀번호로 인증. 예제에서는 검색을 위해 관리자 DN으로 먼저 바인딩, 이후 사용자 DN으로 재바인딩하여 인증 시도.
- 익명 바인딩:
- 검색(
ldap_search
): 기준 DN(searchBase
) 하위에서, 필터(searchFilter
) 조건으로 검색 수행. - 엔트리 얻기(
ldap_get_entries
): 검색 결과에서 모든 일치 엔트리 정보 배열로 반환. - 연결 해제(
ldap_unbind
): LDAP 서버 연결을 종료하고 자원 반환.
유의사항
- LDAP 서버 필요: 본 문서 및 예제는 PHP에서 OpenLDAP 클라이언트 확장을 사용하는 방법만 다루고 있습니다. 실제로 연결할 LDAP 서버가 필요하며, 이는 ServBay와 별개로 설치/운영되는 로컬 OpenLDAP 서버 또는 사내 LDAP/Active Directory 서버가 될 수 있습니다.
- 보안: 운영 환경에서는 LDAP 인증 정보를 다룰 때 환경 변수, 보안 설정 파일 등을 사용하고, LDAPS(SSL/TLS, 기본 포트 636)로 암호화된 연결을 반드시 권장합니다. 평문 LDAP(389번 포트)는 피하세요.
- 오류 처리: 예제의 오류 처리는 기초 수준입니다. 실제 서비스에서는 더 견고한 예외 처리와 로그 기록 방안을 적용하세요.
- DN 형식: DN(Distinguished Name) 포맷은 매우 엄격하므로 여러분의 LDAP 서버 설정과 정확히 동일하게 작성해야 합니다.
자주 묻는 질문 (FAQ)
Q: phpinfo()
에 ldap
항목이 보이지 않거나 비활성(disabled)로 뜹니다. 어떻게 해야 할까요?
A: ServBay에서는 PHP OpenLDAP 확장이 기본 활성화되어 있습니다. 문제가 있을 경우, 확인 중인 phpinfo()
가 실제로 제대로 된 PHP 버전의 출력인지 점검하세요. 그래도 나타나지 않는다면, ServBay의 해당 버전 PHP 패키지를 재설치하거나 ServBay 지원팀에 문의하세요.
Q: PHP 코드 실행 시 Call to undefined function ldap_connect()
오류가 발생합니다.
A: 이는 PHP OpenLDAP 확장이 제대로 로드·활성화되지 않았기 때문입니다. 위에 설명된 phpinfo()
를 이용해 확장 상태를 먼저 확인해 보세요.
Q: 확장이 활성화되어 있는데도 연결 또는 바인딩이 실패하고 LDAP 오류가 납니다.
A: 연결 설정(서버 주소, 포트)과 바인딩 계정(DN, 비밀번호)이 올바른지 꼼꼼히 확인하세요. LDAP 오류 메시지(ldap_error()
로 확인)는 원인 단서를 제공합니다. 예를 들어 “Invalid credentials”(인증 정보 불일치), “Can't contact LDAP server”(서버 연결 불가) 등이 있을 수 있습니다. LDAP 서버가 실제로 실행 중인지, 네트워크 연결이 되는지 역시 체크하세요.
결론
ServBay는 PHP OpenLDAP 확장을 손쉽게 설치하고 사용할 수 있는 개발 환경을 제공합니다. 간단한 확인 절차를 따라하면 PHP 환경에서 LDAP 서버와의 통신이 원활히 되는지 빠르게 점검할 수 있습니다. PHP의 강력한 LDAP 함수 라이브러리와 함께라면, ServBay 기반 로컬 웹 애플리케이션에 사용자 인증, 디렉터리 정보 조회 등 다양한 기능을 유연하게 추가할 수 있습니다. 이를 통해 개발자들은 다양한 실무 시나리오에 효과적으로 대응할 수 있습니다.