2023. 4. 25. 09:45ㆍSpring Framework/Apache Tomcat Server
Apache Tomcat 서버에서 **Realm**은 사용자의 인증 및 권한 부여를 처리하는 중요한 구성 요소입니다. Realm은 애플리케이션에서 사용자 이름, 비밀번호, 역할 등의 정보를 저장하고 이를 통해 웹 애플리케이션의 보안 제어를 제공합니다. 즉, **Realm**은 인증(authentication)과 권한 부여(authorization)를 구현하는데 사용됩니다.
## Apache Tomcat의 Realm 개요
Tomcat 서버는 자바 서블릿과 JSP(JavaServer Pages)를 실행할 수 있는 컨테이너입니다. 이 컨테이너는 애플리케이션에 대한 접근을 제어하기 위해 인증 및 권한 부여 메커니즘이 필요하며, Realm은 이 역할을 담당합니다.
Realm은 보통 사용자 데이터베이스와 상호작용하여 사용자가 제공한 자격 증명(아이디, 비밀번호 등)이 유효한지 확인하고, 유효한 경우 해당 사용자가 어떤 권한을 가지고 있는지(역할, Role)를 결정합니다. Tomcat에서 사용되는 일반적인 인증 방식은 **BASIC**, **DIGEST**, **FORM**, 그리고 **CLIENT-CERT**입니다.
## Realm의 동작 방식
1. **인증(Authentication)**:
- 클라이언트가 특정 리소스에 접근을 시도하면, Tomcat은 해당 리소스에 대한 인증이 필요한지 확인합니다.
- 인증이 필요하다면 클라이언트는 자격 증명을 제시해야 합니다(예: 사용자 이름과 비밀번호).
- Tomcat은 Realm을 통해 제공된 자격 증명을 확인하고, 데이터베이스 또는 사용자 저장소에서 해당 정보가 유효한지 검사합니다.
2. **권한 부여(Authorization)**:
- 사용자가 인증되면, 그 사용자가 특정 리소스에 접근할 수 있는 권한(역할)이 있는지를 확인합니다.
- Realm은 인증된 사용자의 역할(Role)을 확인하여, 사용자가 해당 자원에 접근할 수 있는지를 판단합니다.
## Tomcat에서 사용되는 주요 Realm 유형
### 1. **JDBCRealm**
- **JDBCRealm**은 데이터베이스에 저장된 사용자 자격 증명 정보를 사용하는 Realm입니다.
- 사용자가 제공한 자격 증명은 JDBC를 통해 데이터베이스와 연동되어 확인됩니다.
- 일반적으로 사용자 테이블, 역할 테이블을 만들어 사용하며, 각 테이블에서 사용자 이름, 비밀번호, 역할 정보를 관리합니다.
**설정 예시**:
```xml
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="cohttp://m.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb"
connectionName="db_user"
connectionPassword="db_password"
userTable="users"
userNameCol="username"
userCredCol="password"
userRoleTable="user_roles"
roleNameCol="role"/>
```
### 2. **MemoryRealm**
- **MemoryRealm**은 메모리에 사용자 정보가 저장된 Realm입니다. `tomcat-users.xml` 파일에 직접 사용자와 역할 정보를 저장하여 사용할 수 있습니다.
- 이는 테스트 목적으로 많이 사용되며, 운영 환경에서는 잘 사용되지 않습니다.
**설정 예시**:
```xml
<tomcat-users>
<user username="admin" password="admin" roles="manager-gui,admin-gui"/>
<user username="user" password="password" roles="user"/>
</tomcat-users>
```
### 3. **DataSourceRealm**
- **DataSourceRealm**은 JDBCRealm과 유사하지만, Tomcat에서 설정한 데이터소스를 통해 데이터베이스 연결을 관리합니다.
- 이 방식은 데이터베이스 풀링을 통해 성능을 개선할 수 있으며, JDBCRealm보다 효율적입니다.
**설정 예시**:
```xml
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/myDataSource"
userTable="users"
userNameCol="username"
userCredCol="password"
userRoleTable="user_roles"
roleNameCol="role"/>
```
### 4. **JNDIRealm**
- **JNDIRealm**은 디렉터리 서비스(LDAP, Active Directory 등)를 사용해 인증을 처리합니다.
- 이는 기업 환경에서 중앙 집중화된 사용자 관리를 위해 LDAP 서버와 연동하여 사용됩니다.
**설정 예시**:
```xml
<Realm className="org.apache.catalina.realm.JNDIRealm"
connectionURL="ldap://localhost:389"
userPattern="uid={0},ou=people,dc=mycompany,dc=com"/>
```
### 5. **LockOutRealm**
- **LockOutRealm**은 인증 실패가 반복되는 경우 계정을 잠글 수 있는 기능을 제공합니다.
- 이를 통해 무차별 대입 공격(Brute Force Attack)을 방지할 수 있습니다.
**설정 예시**:
```xml
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.MemoryRealm"/>
</Realm>
```
## Realm의 설정 위치
Realm은 Tomcat의 여러 곳에서 설정할 수 있습니다.
1. **Server 전체에 적용**:
`conf/server.xml` 파일에서 `<Engine>` 또는 `<Host>` 태그 내부에 Realm을 정의하면 Tomcat의 모든 웹 애플리케이션에 적용됩니다.
```xml
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.MemoryRealm"/>
...
</Engine>
```
2. **개별 웹 애플리케이션에 적용**:
`WEB-INF/context.xml` 또는 `META-INF/context.xml` 파일에 Realm을 정의하면 특정 웹 애플리케이션에만 적용됩니다.
## Tomcat Realm의 보안 고려 사항
1. **비밀번호 암호화**: 비밀번호를 저장할 때는 반드시 암호화를 사용해야 합니다. JDBCRealm의 경우 `digest` 속성을 사용하여 비밀번호를 해시 처리할 수 있습니다.
```xml
<Realm className="org.apache.catalina.realm.JDBCRealm"
digest="MD5"
... />
```
2. **SSL 사용**: Realm을 통해 인증 정보를 주고받을 때는 SSL을 사용하여 네트워크 상에서의 데이터를 보호해야 합니다. 특히 LDAP이나 데이터베이스와의 통신에서 SSL이 권장됩니다.
3. **계정 잠금**: 무차별 대입 공격을 방지하기 위해 계정 잠금 기능을 설정하는 것이 좋습니다. `LockOutRealm`을 활용할 수 있습니다.
### Spring Boot Security
Apache Tomcat의 Realm과 Spring Boot Security는 각각 독립적인 보안 구성 요소지만, Spring Boot Security는 더 확장적이고 고급 보안 기능을 제공합니다. 일반적으로 Spring Boot Security를 사용하면 Tomcat의 Realm을 직접적으로 활용할 필요는 없습니다. 대신, Spring Security의 인증 및 권한 부여 메커니즘을 사용하게 되는데, 이는 더 유연하고 강력한 보안 프레임워크를 제공합니다.
'Spring Framework > Apache Tomcat Server' 카테고리의 다른 글
Context (0) | 2023.06.04 |
---|---|
Thread Pool (0) | 2023.05.25 |
AJP (Apache JServ Protocol) Connector (0) | 2023.04.28 |
Coyote Connector (0) | 2023.04.17 |
Valve (0) | 2023.04.13 |