1. 개요

이 기사에서는 Tomcat 서버 기본 사항, 작동 방식 및 Tomcat의 SSO (Single Sign-On ) 기능을 활성화하는 방법에 대해 알아봅니다. Tomcat 서버와 웹 앱의 필수 구성을 살펴보겠습니다.

2. 톰캣 아키텍처

Catalina 서블릿 컨테이너를 구성하는 주요 부분은 커넥터를 정의하는 서비스를 포함하는 서버와 호스트로 구성된 엔진이며 마지막으로 이러한 호스트에는 컨텍스트 또는 웹 앱이 포함됩니다.

커넥터는 클라이언트의 요청을 듣고 응답을 다시 보냅니다. Tomcat 10에서는 HTTP/1.1 , HTTP/2AJP 프로토콜에 대한 커넥터를 찾을 수 있습니다 .

엔진은 커넥터가 받은 요청을 처리하고 출력을 생성합니다. 여기에는  응답을 생성하기 위해 요청별로 실행되는 일련의 프로세스인 처리 파이프라인 이 포함됩니다. 이러한 프로세스는 Tomcat의 밸브 입니다. 예를 들어 Tomcat의 SSO는 밸브로 구현됩니다.

그런 다음 네트워크 이름을 서버와 연결하는 가상 호스트를 정의할 호스트를 찾습니다. 이것은 SSO 밸브가 정의되는 수준이므로 호스트의 모든 컨텍스트는 SSO 아래에 있게 됩니다.

마지막으로 호스트와 연결된 컨텍스트 요소가 있습니다. 이러한 컨텍스트는 서버에서 실행될 웹 응용 프로그램입니다. 컨텍스트는 서블릿 사양 2.3 이상을 따라야 합니다.

3. Tomcat의 싱글 사인온

Tomcat은 호스트 수준에서 구성해야 하는 밸브에 Single Sign-On 기능을 구현합니다. 작동 방식은 SSO 밸브가 사용자 자격 증명을 저장하고 필요할 때 전달하므로 사용자는 다시 로그인할 필요가 없습니다.

SSO 밸브는 다음 요구 사항이 충족되어야 합니다 .

  • Realm 또는 "사용자 데이터베이스" 는 가상 호스트 아래의 모든 웹 앱에서 공유해야 합니다.
  • 웹 앱 인증 메커니즘은 표준 인증자( Basic , Digest , Form , SSL 또는 SPNEGO ) 중 하나여야 합니다 .
  • 클라이언트가 보호된 리소스를 요청하면 서버는 웹 앱의 인증 메커니즘을 실행합니다.
  • 서버는 인증된 사용자의 역할을 사용하여 다시 로그인하지 않고 가상 호스트에서 웹 앱의 보호된 리소스에 액세스합니다.
  • 사용자가 웹 앱에서 로그아웃하면 서버는 모든 웹 앱에서 사용자 세션을 무효화합니다.
  • 클라이언트는 쿠키를 수락해야 합니다. 쿠키는 요청을 사용자 자격 증명과 연결하는 토큰을 저장합니다.

3.1. Tomcat 서버 구성

서버 측에서 SingleSignOn 밸브와 Realm 또는 "사용자 데이터베이스" 를 구성해야 합니다 . 이러한 구성은 Tomcat 설치의 conf 폴더 아래에 있는 server.xml 파일 안에 있습니다. SSO 밸브를 추가하려면 다음 행의 어노테이션을 제거해야 합니다.

<Valve className="org.apache.catalina.authenticator.SingleSignOn" />

기사의 예에서는 기본 구성된 Realm을 사용하고 사용자를 데이터베이스에 추가하기만 하면 됩니다 . 영역 정의는 다음과 같습니다.

<Realm
  className="org.apache.catalina.realm.UserDatabaseRealm"
  resourceName="UserDatabase"/>

이 구성은 전역 JNDI 리소스를 사용하여 사용자 데이터베이스의 소스를 정의합니다.

<Resource name="UserDatabase" auth="Container"
  type="org.apache.catalina.UserDatabase"
  description="User database that can be updated and saved"
  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  pathname="conf/tomcat-users.xml" />

리소스는 org.apache.catalina.UserDatabase 유형의 개체를 인스턴스화 하고 팩토리 클래스 org.apache.catalina.users.MemoryUserDatabaseFactory 를 사용하여 tomcat-users.xml 파일에서 개체를 채웁니다  .

마지막으로 기사의 예에서 요구하는 관리자 역할을 가진 사용자를 추가하는 방법을 살펴보겠습니다. tomcat-users.xml 파일을 수정해야 합니다.

<tomcat-users xmlns="http://tomcat.apache.org/xml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
  version="1.0">
    <role rolename="admin"/>
    <user username="demo" password="demo" roles="admin"/>
</tomcat-users>

3.2. 웹 앱 구성

서버 구성을 마쳤으면 각 서블릿의 WEB-INF 폴더에 있는 web.xml 구성 파일을 통해 서블릿을 구성해 보겠습니다.

SSO가 필요한 모든 웹 앱에는 보호된 리소스가 있어야 하며 Tomcat 인증 방법 중 하나를 사용해야 합니다 . Servlet API 사양 2.3에 정의된 대로 웹 앱의 인증 메커니즘은 web-app 요소 내부의 login-config 요소에 정의되어 있습니다. 이 요소에는 BASIC, DIGEST, FORM 또는 CLIENT-CERT 값 중 하나를 사용해야 하는 인증 방법 양식이 포함됩니다. 인증 방법마다 구성이 다르지만 Tomcat 웹 앱 구성 섹션에서는 DIGEST 및 FORM 인증 방법에 대해서만 설명합니다.

웹 앱 구성을 완료하려면 보호 영역을 설정해야 합니다 . web-app 요소 아래의 web.xml 파일 내에서 필요한 만큼 security-constraint 요소를 추가할 수 있습니다. 각 Security 제약 조건은 보호된 리소스에 대한 URL 패턴을 정의하고 허용되는 역할을 설정합니다. 또한 모든 역할과 함께 security-role 요소를 정의해야 하며 tomcat-users.xml 파일의 정의와 일치해야 합니다. 다음 섹션에서 예를 살펴보겠습니다.

4. 인증 메커니즘의 예

이제 웹 앱을 구성하는 방법을 알았으므로 Ping과 Pong의 두 가지 예를 살펴보겠습니다. 우리는 SSO가 다른 메커니즘과 잘 작동한다는 것을 보여주기 위해 다른 인증 메커니즘을 선택했습니다 .

4.1. 핑 인증 메커니즘

ping 웹 앱에서는 FORM 인증 방법을 사용합니다. FORM 인증 방법은 로그인 양식이 필요하며 웹 페이지에서 로그인에 실패했습니다 . 예를 들어 이 방법은 웹 앱처럼 보이도록 로그인 페이지를 사용자 지정하려는 경우 유용하며 구성은 다음과 같습니다.

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/logging.html</form-login-page>
        <form-error-page>/logging_error.html</form-error-page>       
    </form-login-config>
</login-config>

로그인 페이지는 양식 의 이름이나 입력 필드를 선택할 수 없기 때문에 서블릿 사양 2.3의 로그인 양식 노트에 정의된 엄격한 규칙을 따라야 합니다. j_security_checkj_usernamej_password 여야 합니다 . 이는 로그인 양식이 모든 종류의 리소스와 함께 작동하고 서버에서 아웃바운드 양식의 작업 필드를 구성할 필요가 없도록 하기 위함입니다. 다음과 같이 표시되어야 하는 예를 볼 수 있습니다.

<!DOCTYPE html>
<html>
<head>
    <title>Ping - Login</title>
</head>
<body>
    <form method="post" action="j_security_check">
        <table >
            <tr>
                <td>User name: </td>
                <td><input type="text" name="j_username" size="20"/></td>
            </tr>
            <tr>
                <td>Password: </td>
                <td><input type="password" name="j_password" size="20"/></td>
            </tr>
        </table>
        <p></p>
        <input type="submit" value="Submit"/>
         
        <input type="reset" value="Reset"/>
    </form>
</body>
</html>

FORM 인증 웹 앱의 보호된 리소스에서 요청을 수신할 때 서버에서 어떤 일이 발생하는지 이해하기 위해 이 인증 메커니즘의 흐름을 요약해 보겠습니다.

우선 클라이언트는 보호된 리소스를 요청합니다. 서버에 유효한 SSO 세션 ID가 없으면 서버는 클라이언트를 로깅 양식으로 리디렉션합니다. 사용자가 양식을 작성하고 자격 증명을 서버로 보낸 후 인증 메커니즘이 시작됩니다.

사용자 인증이 성공한 후 서버는 사용자의 역할을 확인하고 Security 제약 조건이 하나 이상을 허용하는 경우 서버는 클라이언트를 요청된 URL로 리디렉션합니다. 다른 경우에는 서버가 클라이언트를 오류 페이지로 리디렉션합니다.

4.2. 퐁 인증 메커니즘

Pong 웹 앱에서는 DIGEST 인증 메커니즘을 사용하며 구성은 다음과 같습니다.

<login-config>
    <auth-method>DIGEST</auth-method>
</login-config>

DIGEST 인증 메커니즘 흐름은 BASIC 인증과 유사합니다. 클라이언트가 보호된 리소스를 요청하면 서버는 사용자 자격 증명을 요청하는 대화 상자를 반환합니다. 인증에 성공하면 서버는 요청한 리소스를 반환하지만 다른 경우에는 서버가 인증 대화 상자를 다시 보냅니다.

DIGEST 및 BASIC 인증 방법은 비슷하지만 중요한 차이점이 있습니다. 비밀번호는 서버에 남아 있습니다.

4.3. 웹 앱 Security 제약 조건 구성

이 시점에서 우리는 Ping과 Pong을 구분하지 않을 것입니다. 값이 다른 요소가 있음에도 불구하고 구성의 중요한 부분은 두 앱에서 동일하게 유지됩니다.

<security-constraint>
    <display-name>Ping Login Auth</display-name>
    <web-resource-collection>
        <web-resource-name>PingRestrictedAccess</web-resource-name>
        <url-pattern>/private/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Security 제약 조건은 개인 폴더 아래의 모든 것이 보호된 리소스임을 정의하고 리소스에 액세스하기 위해 관리자 역할이 있어야 하는 필요성도 정의합니다.

5. 예제 실행

이제 Tomcat 10 서버를 설치하고 이전 기사에서 설명한 대로 구성을 조정하고 Ping 및 Pong 웹 앱을 Tomcat의 웹 앱 폴더에 넣어야 합니다.

서버가 가동되고 실행되고 두 앱이 모두 배포되면 리소스 http://localhost:8080/ping/private를 요청합니다. 로그인하지 않았기 때문에 서버에 로그인 인증이 표시됩니다.

ping 앱 로그인 요청

그런 다음 Tomcat 서버 구성 섹션 에서 구성된 자격 증명을 소개하고 양식을 제출해야 합니다. 서버가 자격 증명의 유효성을 검사하면 pong의 비공개 섹션을 가리키는 링크가 있는 웹 페이지가 표시됩니다.

ping 앱 개인 페이지

서버가 액세스를 확인하지 않는 경우 로그인 오류 페이지가 표시됩니다.

ping 앱 로그인 오류

Ping 앱에 성공적으로 로그인한 후 Pong의 비공개 섹션에 대한 링크를 클릭하면 SSO 메커니즘이 작동하는 것을 볼 수 있습니다. 세션이 이미 활성화된 경우 서버는 다시 로그인할 필요 없이 Pong의 보호된 리소스를 보냅니다.

탁구 앱 비공개 페이지

마지막으로 세션이 만료된 후 서버가 로그인 페이지를 다시 표시하는지 확인할 수 있습니다. 몇 분 정도 기다렸다가 ping의 비공개 섹션 링크를 클릭하면 됩니다.

6. 기타 SSO 솔루션

이 기사에서는 Tomcat 서버에 의해 구현된 Web-SSO를 다루었습니다. 다른 SSO 옵션을 탐색하려는 경우 다음은 인기 있는 옵션입니다.

7. 결론

이 사용방법(예제)에서는 Tomcat 아키텍처의 기본 사항을 배웠습니다. 나중에 서버 구성 방법을 검토했습니다. 마지막으로 SSO에 포함되어야 하는 서블릿 또는 웹 앱의 구성을 검토했습니다.

늘 그렇듯이 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Security footer banner