Active Directory란?
사용자 정보를 저장하고 관리하는 데이터베이스의 한 유형으로 디렉토리 서비스의 한 유형이다. 친숙한 관계형 데이터베이스(MySQL, OracleDB 등)와 다르게 AD(Active Directory)는 도메인 네임 시스템(DNS)을 기반으로한 디렉토리 구조로 데이터를 저장/관리한다.
* 이름을 기준으로 데이터에 손쉽게 접근할 수 있다.
example) 저장되는 데이터의 name 예시 - 아래처럼 entry를 ,로 나열한 형태이다.
CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM
('Fabrikam company 세일즈 팀 Jeff Smith'의 식별이름)
데이터 접근방식 - LDAP
AD의 데이터에 접근하기 위해서는 LDAP 프로토콜을 사용한다.
LDAP는 디렉토리 서비스에 접근하여 데이터를 저장하고 수정할 수 있는 통신 프로토콜을 의미한다.
관계형 데이터베이스와 디렉토리 서비스를 간단히 비교한다면 아래와 같다.
MySQL | Active Directory(AD) | |
데이터베이스 유형 | RDBMS | Directory Service |
프로토콜 | database access protocol | LDAP |
Connection API | JDBC | LdapContext |
LDAP 스키마 (LDAP Object)
LDAP 프로토콜을 사용해 조회할 수 있는 대상의 속성(객체)정보를 가지고 있는 것을 LDAP 스키마라고 부른다. 대상의 식별이름(DN)과 관련있으며 다양한 속성을 가지고 있다. 대상의 속성정보와 객체클래스 정보를 사용하여 조회할 속성과 검색 조건을 설정할 수 있다.
ex) cn(공통이름), objectGUID(전역식별자 - 중복되지 않는다.), etc
간단한 조회 프로세스
1. DN으로 조회 대상 기준 선택
2. 필터링할 클래스정보 설정
3. 검색할 속성 및 범위 설정
API 코드 구현
public class LdapProtocolManager {
public List<Map<String, String>> read() throws NamingException {
List<Map<String, String>> result = new ArrayList<Map<String, String>>();
// set up environment
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389");
// authentication
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "id");
env.put(Context.SECURITY_CREDENTIALS, "password");
// create initial context
LdapContext context = new InitialLdapContext(env, null);
// set up search condition
String searchName = "OU=ldap,DC=java,DC=margin,DC=com";
String searchFilter = "(objectClass = * )"; // 모든 개체 검색
String[] returningAttributes = {"objectGUID", "cn"};
SearchControls sc = new SearchControls();
sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
sc.setReturningAttributes(returningAttributes);
NamingEnumeration<SearchResult> searchResults = context.search(searchName, searchFilter, sc);
// see search results
while (searchResults.hasMoreElements()) {
SearchResult sr = searchResults.nextElement();
Attributes attr = sr.getAttributes();
String objectGUID = attr.get("objectGUID").get().toString();
String cn = attr.get("cn").get().toString();
Map<String, String> map = new HashMap<>();
map.put("objectGUID", objectGUID);
map.put("cn", cn);
result.add(map);
}
context.close();
return result;
}
}
코드 예시
https://github.com/JaewookMun/java-api/tree/main/src/com/margin/java/ldap
참고
- 액티브 디렉토리 구조 이해 - https://mapoo.net/os/oswindows/%EC%97%91%ED%8B%B0%EB%B8%8C-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4/
- Object의 식별이름(DN - Distinguished Names) 설명 - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ldap/distinguished-names
- Microsoft LDAP search 방식 - https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc978021(v=technet.10)
- LDAP 구현방식 (Java official 사이트) - https://docs.oracle.com/javase/tutorial/jndi/ldap/authentication.html
- Microsoft 검색필터 정의 - https://docs.microsoft.com/ko-kr/windows/win32/adsi/search-filter-syntax?redirectedfrom=MSDN
'Java' 카테고리의 다른 글
[Java] JPA 이해하기 (1) | 2024.12.20 |
---|---|
Anonymous Class (익명 클래스)란? (+ GUI에서의 활용) (0) | 2021.05.22 |
char - int 형변환 살펴보기 (0) | 2021.05.18 |
객체생성 (Creating Objects) // ref: new 연산자 (0) | 2021.05.05 |
[OOP] 클래스, 객체, 인스턴스 in Java (0) | 2021.05.03 |