[Tomcat] HTTP Connector


 [ Tomcat 공식문서 한글번역 링크 ]


[ 목차 ]

[ 소개 ]
[ 속성 ]
 1. 공통 속성
 2. 표준 구현 속성
 3. Java TCP 소켓 속성
 4. NIO 전용 속성
 5. NIO2 전용 속성
[ 중첩 구성 요소 ]
[ 특수 기능 ]
 1. HTTP/1.1 및 HTTP/1.0 지원
 2. HTTP/2 지원
 3. Proxy 지원
 4. Unix 도메인 소켓 지원
 5. SSL 지원
 6. SSL 지원 - SSLHostConfig 속성
 7. SSL 지원 - Certificate 속성
 8. SSL 지원 - Connector - NIO 및 NIO2
 9. SSL 지원 - OpenSSL 의 SSL_CONF API
 10. 키저장소(Key Store) 유형
 11. Connector 비교



[ 소개 ]

- HTTP Connector 요소는 HTTP/1.1 프로토콜을 지원하는 Connector 컴포넌트를 나타내며, 이를 통해 Catalina 는 Servlet 및 JSP 페이지를 실행하는 기능 외에도 독립형 웹 서버로 작동할 수 있다.
- 이 Connector 요소를 사용하는 인스턴스는 서버의 특정 TCP 포트 번호에서 연결을 수신 대기한다.
- 하나의 Service 에 여러개의 Connector 가 구성될 수 있으며, 각각의 Connector 는 해당 Service 와 연관된 Engine 으로 포워딩하여 Request 를 처리하고 Response 를 생성한다.

- (Apache 1.3 용 mod_jk 1.2.x Connector 와 같이) AJP 프로토콜을 사용하여 웹 서버에 Connector 를 구성하려면 AJP Connector 문서를 참고한다.


- (비동기 요청이 아닌) 모든 들어오는 Request 는 (대기시간을 포함한) 요청기간동안 각각의 Thread 가 필요하다.
- 만일 현재 사용 가능한 Request 처리 Thread 보다 더 많은 동시 Request 가 수신된다면 구성된 (maxThreads 속성) 최대값 까지 추가 Thread 가 생성된다.

- 동시 요청이 더 많아지면 Tomcat 은 현재 현재 (요청에 대한) Connection 수가 maxConnections 에 도달할 때까지 새로운 Connection 을 수락(연결)한다.
- Connection은 해당 Connection 을 처리할 Thread 를 사용할 수 있을 때까지 Connector 가 생성한 서버 소켓 내부에서 Queue(대기열)에 저장한다.
- maxConnections 에 도달하면 운영체제에서 추가 Connection 을 Queue 에 저장하며, OS 에서 제공하는 Queue 의 사이즈는 acceptCount 속성을 통해 제어할 수 있다.
- 운영체제의 Queue 가 가득차면 추가 Connection 요청은 거부되거나 시간초과(timeout) 될 수 있다.


[ 추가 설명 ]

- maxThreads : (Connection 된) Request 를 처리하는 Thread 최대 개수
- maxConnections : 동시에 Connection 맺을수 있는 최대 개수
- acceptCount : 운영체제에서 Connection 을 맺기위한 Queue(대기열) 최대 개수



[ 속성 ]

1. 공통 속성

- 모든 Connector 구현체는 아래의 속성을 지원한다.

속성 설명
allowBackslash true 설정 시 역슬래시(\) 문자를 경로 구분 기호로 허용된다. (기본값: false)
allowTrace HTTP TRACE 메소드 허용 여부 (기본값: false)

RFC 7231 섹션 4.3.8 에 따라 TRACE 요청의 응답에 cookie 와 authorization 헤더는 제외된다.
만일 이러한 헤더를 포함하려면 대상 Servlet 에서 doTrace() 메소드를 구현하여 응답을 제어할 수 있다.
asyncTimeout 비동기 요청에 대한 timeout 시간 (기본값: 30000, 30초-서블릿 스펙)
discardFacades 컨테이너 내부 요청 처리 객체를 격리하는 파사드 객체의 재활용 여부 (기본값: true)
true 설정 시 모든 요청 후 가비지 수집을 위해 파사드가 설정되고 false 설정 시 재사용된다.
enableLookups true 셋팅 시 원격 클라이언트의 실제 호스트 이름을 반환하기 위해 request.getRemoteHost() 를 호출하여 DNS 조회를 수행, false 셋팅 시 DNS 조회를 건너뛰고 IP 주소를 문자열 형식으로 반환 (기본값: false, 성능 향상)
encodedSolidusHandling %2f 시퀀스가 포함된 Request 경로를 처리하는 방식 (기본값: reject)

1. reject: %2f 시퀀스를 포함한 요청 경로를 400 응답으로 거부
2. decode: %2f 를 / 로 디코딩 (%nn 형식도 같이 디코딩됨)
3. passthrough: %2f 를 변경하지 않고 처리

[ 추가 설명 ]
- 기본 URL: http://example.com/index.php?page=260&id=22
- 인코딩 URL: http%3A%2F%2Fwww.example.com%2Findex.php%3Fpage%3D260%26id%3D22
enforceEncodingInGetWriter true 인경우 문자 인코딩이 지정되지 않은경우 Response.getWriter() 호출 하게되면 이후에는 Response.getCharacterEncoding() 를 호출하거나 Content-Type 응답헤더에 ISO-8859-1 을 기본값으로 사용 (기본값: true)
maxCookieCount 요청당 허용되는 쿠키의 최대 개수 (기본값: 200)
음수값 설정 시 무제한
maxParameterCount 쿼리 문자열 및 Request Body에서 받을 수 있는 요청 매개변수 최대 개수 (기본값: 1000)
음수값 설정 시 무제한

Request Body 는 Post 상황에서 Content Type 이 application/x-www-form-urlencoded 또는 multipart/form-data 인 경우
maxPostSize 컨테이너에서 처리할 수 있는 POST 요청 본문의 최대 사이즈 (기본값: 2097152, 2MB)
음수값 설정 시 무제한이며, 이 제한을 초과하는 요청은 거부된다.
maxSavePostSize FORM 또는 CLIENT-CERT 인증 및 HTTP/1.1 업그레이드 중에 컨테이너가 저장/버퍼링할 요청의 본문 최대 사이즈 (기본값: 4096, 4KB)

* 원문내용 요약함 *
parseBodyMethods application/x-www-form-urlencoded 를 요청 매개변수로 처리할 (쉼표로 구분된) HTTP 메서드 목록 (기본값: POST)

* 원문 내용 요약함 *
port
(필수)
해당 Connector 가 서버 소켓을 생성하고 수신 대기할 TCP 포트 번호
0 으로 설정 시 Tomcat 이 임의의 사용 가능한 포트를 사용함.
protocol 수신 트래픽을 처리할 프로토콜 설정 (기본값: HTTP/1.1 - Java NIO 기반의 커넥터)

명시적 프로토콜 값 (본문 마지막의 비교표 참고)
1. org.apache.coyote.http11.Http11NioProtocol
2. org.apache.coyote.http11.Http11Nio2Protocol

Java Connector 의 구성은 http 와 https 모두 동일하다
proxyName Connector 가 프록시 구성에 사용되는 경우 request.getServerName() 호출 시 반환될 이름

자세한 내용은 하단 특수기능 섹션의 '3. Proxy 지원' 부분 참고
proxyPort Connector 가 프록시 구성에 사용되는 경우 request.getServerPort() 호출 시 반환될 포트

자세한 내용은 하단 특수기능 섹션의 '3. Proxy 지원' 부분 참고
redirectPort SSL 이 필요한 요청이 수신되면 지정된 포트로 자동 리디렉션 한다.
rejectSuspiciousURIs Servlet 6.0 스펙에 의해 식별된 의심스러운 URI 패턴중 하나와 일치하는 경우 요청을 거부할지 여부 (기본값: false)
scheme request.getScheme() 호출 시 반환하는 프로토콜의 이름 설정 (기본값: http)
예) SSL Connector 의 경우 이 속성을 https 로 설정할 수 있다.
secure true 설정 시 이 Connector 가 수신한 요청에 대해서 request.isSecure() 호출 시 true 를 반환한다. (기본값: false)

크립토 카드, SSL 어플라이언스, 웹서버와 같은 SSL 가속기로부터 데이터를 수신하는 (SSL, non-SSL) Connector 에 이 속성을 설정할 수 있다.
URIEncoding URL의 URI 바이트를 디코딩 하는데 사용할 문자 인코딩 (기본값: UTF-8)
useBodyEncodingForURI URI 쿼리 매개변수에 URIEncoding 대신 contentType 에 지정된 인코딩을 사용할지 여부 (기본값: false)
이 속성은 Tomcat_4.1.x 와의 호환성을 위해 존재함

* 원문 내용 요약함 *
useIPVHosts 요청을 수신한 IP 주소를 사용하여 요청을 보낼 호스트를 결정할지 여부 (기본값: false)
xpoweredBy Servlet 스펙을 지원한다는 헤더를 사용할지 여부 (기본값: false)

1004lucifer

2. 표준 구현 속성

- 표준 HTTP Connector (NIO 및 NIO2 포함) 는 위 공통 속성 외에 다음 속성을 모두 지원한다.

속성 설명
acceptCount maxConnections 에 도달했을 때 들어오는 연결 요청에 대해 운영체제에서 제공하는 Queue(대기열)의 최대 길이 (기본값: 100)

운영체제는 이 설정을 무시하고 Queue 에 다른 사이즈를 사용할수도 있으며, 이 대기열이 가득 차게되면 운영체에서 추가 Connection 을 거부하거나 timeout 이 발생할 수 있다.
acceptorThreadPriority 새로운 Connection 을 수락(연결)하는데 사용되는 Acceptor Thread 의 우선순위 (기본값: 5 - java.lang.Thread.NORM_PRIORITY)

자세한 내용은 java.lang.Thread 클래스의 JavaDoc 참고
address 여러 IP 를 가진 서버의 경우, 지정된 포트에서 수신 대기할 주소를 지정하며, 기본적으로 Connector 는 모든 로컬 주소를 수신한다.

JVM 에 별다른 시스템 프로퍼티를 설정하지 않은경우 (NIO, NIO2 포함) Connector 는 (IPv4) 0.0.0.0 또는 (IPv6) :: 로 모두 수신한다.
allowedTrailerHeaders 기본적으로 Tomcat 은 청크된 입력을 처리할 때 모든 Trailer 헤더를 무시한다.
헤더를 처리하려면 헤더 이름을 쉼표(,)로 구분하여 목록에 추가해야 한다.
bindOnInit Connector 의 bindOnInit 속성은 소켓이 언제 바인딩 되는지 제어하는 기능이다. (기본값: true)

(Request 소켓의 연결/해제)
true 일 때는 Connector 가 초기화 될 때 바인딩 되고 Connector 가 종료될 때 바인딩이 해제되며, false 일때는 Connector 가 시작될 때 바인딩 되고 Connector 가 중지될 때 바인딩이 해제된다.

[추가설명]
<Service> 의 gracefulStopAwaitMillis 속성과 연관되어 적용된다. false 로 변경할 시 해당 속성 확인 필요
clientCertProvider java.security.cert.X509Certificate 인스턴스가 아닌 다른 형식으로 제공된 클라이언트 인증서 정보를 변환하는데 사용되는 JSEE 공급자를 제어한다.
compressibleMimeType HTTP 압축이 사용될 수 있는 MIME 유형의 쉼표로 구분된 목록이며 명시적으로 지정 시 기본값이 (Override)재정의된다.

기본값 : text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
compression 서버 대역폭을 절약하기 위해 HTTP/1.1 GZIP 압축을 사용할 수 있다. (기본값: off)

[사용 가능한값]
- off : 압축 비활성화
- on : 텍스트 데이터에 대해 압축 허용
- force : 모든 경우에 압축 강제
- (int) 정수값 : 압축을 허용하며 압축되기 전 최소 데이터 사이즈를 지정

[참고]
(대역폭 절약) compression 과 (CPU 절약) sendfile 간에 절충점이 있다.
Connector 가 sendfile 기능을 지원하는 경우(NIO,NIO2) sendfile 사용이 압축보다 우선하여 동작하며 그렇게 되면 48KB 보다 큰 정적 파일이 압축되지 않은 상태로 전송된다.
아래 NIO/NIO2 속성의 useSendfile 속성(기본값: true)을 설정하여 sendfile 기능을 비활성화 하거나 conf/web.xml 또는 웹 애플리케이션의 web.xml 에서 DefaultServlet 구성에서 sendfile 사용 임계값을 변경할 수 있다.
compressionMinSize compression 이 on 으로 설정된경우 압축되기전에 필요한 최소 데이터 (Byte)사이즈 지정 (기본값 : 2048 - 2KB)
connectionLinger Connector 가 사용하는 소켓이 닫힐 때 대기하는 (초)시간 (기본값: -1, 비활성화)
connectionTimeout Connector 가 연결을 수락한 후 요청 URL 이 제공될 때까지 기다리는 (밀리초)시간 (기본값 : 60000 - 60초)

하지만 Tomcat 배포판의 기본 server.xml 설정파일에는 이 값이 20000 (20초) 로 설정 되어있다.

[참고]
disableUploadTimeoutfalse 로 설정되어 있지 않으며 이 시간 초과값은 요청본문(있는경우) 읽을때도 사용된다.
connectionUploadTimeout 데이터 업로드가 진행 중일 때 사용하는 (밀리초) Timeout 시간 (기본값: 300000 - 300초)
이 값은 disableUploadTimeout 이 false 로 설정된 경우에만 적용된다.
continueResponseTiming Expect: 100-continue 헤더가 포함된 요청에 대해 100 상태코드(임시 응답 코드)를 반환하는 시점 지정 (헤더 설명 링크)

[사용 가능한 값]
- immediately : 가능한 빨리 100 상태 응답 반환
- onRead : Servlet 이 요청 본문을 읽을 때만 응답. 이를 통해 Servlet이 헤더를 검사하고, 클라이언트가 큰 요청 본문을 전송하기전에 응답 가능
defaultSSLHostConfigName 클라이언트 연결이 (Server Name Indication - TLS 확장 표준) SNI 를 제공하지 않거나 제공된 SNI 가 구성된 SSLHostConfig 와 일치하지 않는경우 (이 Connector 가 보안연결용으로 구성된경우) 보안 연결에 사용되는 기본 SSLHostConfig 의 이름 (기본값 : _default_, 설정된 값은 항상 소문자로 변환됨)
disableUploadTimeout 데이터 업로드 중 Timeout 기능을 비활성화 하는 플래그 (기본값 : true - timeout 시간을 초과하여 데이터 업로드 가능)
executor <Executor> 요소에서 지정한 이름 값을 지정한다. (String 값)

이 속성이 설정되고 지정된 Executor 가 존재한다면 Connector 는 해당 Executor Thread Pool 을 사용하며 다른 모든 Thread 속성은 무시한다.
Executor 가 지정되지 않은경우 Connector 는 Thread Pool 을 제공하기 위해 Connector 각각의 (private)내부 Executor 를 사용한다.

[추가의견]
Tomcat_6 에도 옵션이 있는 것으로 보아 예전에는 서버의 리소스를 아끼기 위해 (Executor)공용 Thread Pool 을 만들어서 복수의 Connector 에 공유하여 사용했을 것으로 추측되는데 이제는 굳이 그럴필요가 있을까 싶다. 돈을 좀 더 들여 좋은 스펙을 사용하여 안정성을 확보하는게 더 나을것으로 생각한다.
executorTerminationTimeoutMillis Connector 의 내부 Executor (Thread Pool) 가 Connector 중지 프로세스를 계속하기전에 Request 처리 Thread 가 종료될 때까지 기다리는 시간 (기본값 : 5000 - 5초)
keepAliveTimeout Connector 가 연결을 종료하기전에 다른 HTTP 요청을 기다리는 시간 (기본값 : connectionTimeout 속성에 설정된 값을 사용)
값으로 -1 설정 시 무한정 대기를 한다.
maxConnections 서버에 요청한 Request 를 연결하고 처리하는 최대 연결 개수 (기본값 : 8192)

이 제한에 도달하면 서버는 추가 Request 에 대해서 연결을 수락하지만 Connector 에서 (연결X)처리하지 않으며, maxConnections 미만으로 연결수가 떨어져야만 연결을 (연결O)처리한다.

한도에 도달하면 운영체제는 acceptCount 설정에 따라 연결을 수락할 수 있고 Queue(대기열) 에 추가한다.

NIO/NIO2 Connector 에서는 이 값을 -1 로 설정 시 이 기능이 비활성화 되며 연결 개수가 카운트 되지 않는다. (무제한 연결 처리)
maxExtensionSize (chunked) 청크된 HTTP 요청에서 청크 확장의 총 길이를 제한 (기본값 : 8192)
값으로 -1 설정 시 무제한
maxHeaderCount 컨테이너에서 허용하는 Request 의 최대 Header 개수 (기본값 : 100)
지정된 헤더개수보다 많은경우 요청이 거부된다.
maxHttpHeaderSize maxHttpRequestHeaderSizemaxHttpResponseHeaderSize 에 대한 기본값을 제공한다. (기본값: 8192 - 8KB)
maxHttpRequestHeaderSize HTTP Request 와 관련된 요청 라인과 헤더의 최대 허용 (바이트)사이즈 (기본값 : maxHttpHeaderSize 설정 값)
수신된 바이트 수와 비교하므로 허용 사이즈는 (요청라인+헤더이름+헤더값+공백+라인종결자) 값과 비교된다.

[중요]
Request header is too large 에러 이슈를 해결하기 위해 이값을 늘릴 수 있지만 Tomcat 이 모든 Request 에 대해서 셋팅한 값만큼 할당한다는 것을 명심해야 한다.
예를들어 maxHttpRequestHeaderSize 를 1MB 로 지정하고 Tomcat 이 100개의 동시 Request 를 처리하는경우 요청헤더가 100MB 의 (Heap)힙 메모리를 사용하게 된다.
maxHttpResponseHeaderSize HTTP Response 와 관련된 응답 라인과 헤더의 최대 허용 (바이트)사이즈 (기본값 : maxHttpHeaderSize 설정 값)
기록된 바이트 수와 비교하므로 허용 사이즈는 (요청라인+헤더이름+헤더값+공백+라인종결자) 값과 비교된다.
maxKeepAliveRequests 서버에서 Connection 을 Close 하기 전까지 (연결된 해당 소켓) 파이프라인으로 연결할 수 있는 최대 HTTP 요청 수 (기본값: 100)

이 값을 1 로 설정하면 (HTTP/1.0, HTTP/1.1 의) keep-alive 및 파이프라인이 비활성화 되며, -1 로 설정 시 무제하늬 파이프라인 또는 keep-alive HTTP 요청을 허용한다.

[추가정보]
Client 가 Tomcat 에 Connection 을 맺고 하나의 (TCP 소켓)Connection 에서 여러번 Request/Response 를 주고 받을 수 있는 Keep-Alive 의 요청 최대 횟수라고 생각하면 된다.
maxQueueSize 실행 대기중인 (작업)태스크의 최대 대기열 사이즈 (기본값: Integer.MAX_VALUE)
대기열이 초과되면 태스크가 거부된다.
maxSwallowSize 중단된 업로드에 대해 Tomcat 에서 (무시할)삼킬 요청 본문 데이터를 버퍼링 할 수 있는 최대 바이트 사이즈 (기본값 : 2097152 - 2MB)

중단된 업로드는 요청본문이 무시될 것임을 Tomcat 은 알고있지만 클라이언트가 계속 요청본문을 보내는것을 의미한다. Tomcat 이 클라이언트가 보내는 요청을 삼키지 않으면 클라이언트는 응답을 받을 수 없다.
(-)음수로 값을 셋팅 시 무제한으로 동작한다.

[추가정보]
클라이언트에서 (파일을) 업로드 할 때 중단되는 흔한 경우는 아마 제한된 업로드보다 많은 용량이 업로드가 될 때가 아닐까 싶다.
이런경우가 (파일을 다 받을 수 없는 상황이어서) 중단된 업로드가 발생하는 것이고, 이러한 사항을 Tomcat (또는 Application) 은 알고있지만 요청을 보내는 클라이언트는 모르는 상황이기에 업로드를 지속적으로 할 것이다.
이 때 클라이언트 입장에서 요청이 끝나야 응답을 받을 텐데 Tomcat 이 요청 본문을 삼키지 않고 끊어버린다면 클라이언트는 응답을 받을 수 없을 것이다.
그렇기 때문에 Tomcat 이 해당 응답을 얼마나 삼킬지 버퍼를 지정해 줘야 한다.
다만 -1로 셋팅하여 값을 무제한으로 설정 시 외부에서 1TB 와 같이 말도안되는 용량을 업로드 하게되면 서버가 금방 메모리가 모자라서 사용을 못하게 될 것이므로 이와같이 적정한 용량을 셋팅해야 한다고 생각한다.
maxThreads Connector 에서 생성되는 요청 처리 스레드의 최대 수 (기본값: 200)

Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다.
Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다.
maxTrailerSize (chunk) 청크된 HTTP 요청에서 마지막 청크의 후행 헤더의 총 길이를 제한한다. (기본값: 8192 - 8KB)

[추가정보]
allowedTrailerHeaders 속성에 의하면 톰캣은 기본적으로 모든 메소드에 대해서 트레일러 헤더를 무시한다고 하니 해당 속성에 사용할 메소드를 추가해야 하지 않을까 싶다. (검증 X)
minSpareThreads 항상 실행중인 (Active + Idle) 쓰레드의 최소 제한 값 (기본값: 10)

Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다.
Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다.
noCompressionUserAgents 압축을 사용해서는 안되는 HTTP 클라이언트의 User-Agent 헤더와 일치하는 (java.util.regex 사용)정규식 문자열 (기본값 : "" - EmptyString)

압축을 사용할 수 없는 User-Agent 에 압축을 내려보내지 않기 위해 사용함.
processorCache 프로토콜 핸들러는 성능 향상을 위해 Processor 객체를 캐싱한다. 이 설정은 캐시할 Processor 객체의 개수를 결정한다. (기본값: 200)

이 설정은 워크로드에 따라 성능과 GC 에 큰 영향을 미칠 수 있으며, 모든 처리 객체의 재사용을 방지하여 보안성을 높이는 효과도 있다.

Servlet 3.0 비동기 처리 미사용 : maxThreads 설정과 동일한 값을 사용하는것을 권장
Servlet 3.0 비동기 처리 사용 : maxThreads 와 최대 예상 동시 요청수(동기+비동기) 중 더 큰 값을 선택하는 것을 권장

[사용 가능한 값]
- -1 : 무제한
- 0 : 요청 Processor 재사용 안함
- 정수 : 원하는 설정 값
relaxedPathChars HTTP/1.1 스펙에 따르면 특정 문자는 URI 경로에서 %nn 형식으로 인코딩 되어야 하지만 대부분의 주요 브라우저를 포함한 많은 클라이언트가 이 규정을 준수하지 않고 인코딩 되지 않은 문자를 사용한다.

Tomat 이 이러한 요청을 거부하지 않도록, 허용할 추가 문자을 이 속성을 통해 지정할 수 있다.
지정하지 않으면 추가 문자는 허용하지 않음

사용 가능한 문자 : " < > [ \ ] ^ ` { | }
relaxedQueryChars HTTP/1.1 스펙에 따르면 특정 문자는 URI 쿼리 문자열에서 %nn 형식으로 인코딩 되어야 하지만 대부분의 주요 브라우저를 포함한 많은 클라이언트가 이 규정을 준수하지 않고 인코딩 되지 않은 문자를 사용한다.

Tomat 이 이러한 요청을 거부하지 않도록, 허용할 추가 문자을 이 속성을 통해 지정할 수 있다.
지정하지 않으면 추가 문자는 허용하지 않음

사용 가능한 문자 : " < > [ \ ] ^ ` { | }
restrictedUserAgents Keep-Alive 사용되지 않아야 하는 HTTP 클라이언트의 User-Agent 헤더와 일치하는 (java.util.regex 사용)정규식 문자열 (기본값 : "" - EmptyString)
server HTTP 응답의 Server 헤더 값을 재정의 한다.

Application 에서 Server 헤더를 설정하면 해당 값이 사용되며, 설정하지 않으면 Server 헤더가 추가되지 않는다.
serverRemoveAppProvidedValues Application 에서 설정한 Server 헤더 제거 옵션 (기본값: false)
하지만 server 속성이 설정된 경우 이 속성은 무시된다.
SSLEnabled Connector 에서 SSL 트래픽을 활성화 (기본값: false)
SSL 핸드쉐이크/암호화/복호화 사용하려면 true 설정 필요함.

이 값을 true 설정 시 scheme / secure 속성도 설정하며 request.getScheme()request.isSecure() 가 올바르게 전달되도록 해야 한다.
tcpNoDelay 서버 소켓에서 TCP_NO_DELAY 옵션 활성화 여부 (기본값: true)
대부분의 상황에서 성능을 향상시킨다.
threadPriority JVM 내에서 요청을 처리하는 스레드의 우선순위 설정 (기본값: 5 - java.lang.Thread.NORM_PRIORITY 값과 동일함)

Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다.
Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다.
threadsMaxIdleTime Thread Pool 이 minSpareThreads 보다 많은 Thread 를 가지고 있는 경우 해당 Thread 가 유지되는 최대 시간 (기본값: 60000 - 60초)

Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다.
Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다.
throwOnFailure Connector 가 Lifecycle 전환 중 Exception 을 만났을 때 예외를 던질지 로그에만 남길지 여부 (기본값: false - 예외를 던지지 않고 로그만 남김)

이 기본값은 org.apache.catalina.startup.EXIT_ON_INIT_FAILURE 시스템 속성에 의해 변경될 수 있다.
useAsyncIO 비동기 IO API 사용 활성화 여부 (기본값: true)
useKeepAliveResponseHeader HTTP 응답에 Keep-Alive 헤더를 추가할지 여부 (기본값: true)
useVirtualThreads Connector 의 내부 executor 에서 가상 스레드(Virtual Threads) 를 사용할지 여부 (기본값: false)

만약 executor 가 설정되어 있다면 이 설정은 무시된다.

이 옵션을 사용하려면 JDK 21 이상을 사용해야 한다.


3. Java TCP 소켓 속성

- NIO 및 NIO2 구현체는 위에 나열된 공통 ConnectorHTTP 속성 외에도 다음과 같은 Java TCP 소켓 속성을 지원한다.

속성 설명
socket.rxBufSize (int)
(SO_RCVBUF) 소켓수신버퍼 (바이트)사이즈 (기본값: JVM 기본값)
socket.txBufSize (int)
(SO_SNDBUF) 소켓전송버퍼 (바이트)사이즈 (기본값: JVM 기본값)

일부 JVM 에서 8KB 이하의 값을 설정 시 매누 낮은 성능이 관찰되어 주의 필요.
socket.tcpNoDelay (boolean)
표준 속성 tcpNoDelay 와 동일

[추가정보]
true 로 설정 시 Nagle 알고리즘을 비활성화 하여 작은 패킷을 지연없이 전송한다.
socket.soKeepAlive (boolean)
(SO_KEEPALIVE) 소켓의 Keep-Alive 설정 여부 (기본값: JVM 기본값)
socket.ooBInline (boolean)
소켓의 OOBINLINE(Out-of-BconnectionLingerand Inline) 설정 여부 (기본값: JVM 기본값)
socket.soReuseAddress (boolean)
(SO_REUSEADDR) 소켓주소재사용 옵션 설정 여부 (기본값: JVM 기본값)
socket.soLingerOn (boolean)
(SO_LINGER) 소켓의 연결종료 후 잔류시간 옵션 설정 여부

2. 표준 구현 속성 connectionLinger 의 값이 0 이상이면 true 와 동일하며, 0 미만이면 false 설정한 것과 동일하다.

이 soLingerOn 속성과 soLingerTime 속성이 모두 설정되지 않으면 JVM 기본값을 사용한다.
socket.soLingerTime (int)
(SO_LINGER) 소켓의 연결종료 후 잔류시간 을 초 단위로 설정한다.

위 2. 표준 구현 속성 connectionLinger 과 동일한 역할을 한다.

이 soLingerTime 속성과 soLingerOn 속성이 모두 설정되지 않으면 JVM 기본값을 사용한다.
socket.soTimeout 위 2. 표준 구현 속성 connectionTimeout 과 동일하다.
socket.performanceConnectionTime (int)
성능 설정을 위한 첫번째 값이며 자세한 내용은 성능 소켓 옵션 문서 참고

성능 관련 세가지 속성을 모두 설정하지 않으면 JVM 기본값을 사용한다.
socket.performanceLatency (int)
성능 설정을 위한 두번째 값이며 자세한 내용은 성능 소켓 옵션 문서 참고

성능 관련 세가지 속성을 모두 설정하지 않으면 JVM 기본값을 사용한다.
socket.performanceBandwidth (int)
성능 설정을 위한 세번째 값이며 자세한 내용은 성능 소켓 옵션 문서 참고

성능 관련 세가지 속성을 모두 설정하지 않으면 JVM 기본값을 사용한다.
socket.unlockTimeout (int)
소켓 잠금해제(unlock) 타임아웃 시간 (기본값: 250 - 밀리초)
값은 반드시 양수 이어야 하며, 0 이하의 값은 무시된다.


4. NIO 전용 속성

- 다음의 속성은 NIO Connector 에만 해당된다.
(추가정보: protocol 속성의 기본값인 HTTP/1.1 은 NIO 기반의 Connector 이다.)

속성 설명
pollerThreadPriority (int)
Poller 스레드의 우선순위 설정 (기본값: 5 - java.lang.Thread.NORM_PRIORITY 값과 동일함)
selectorTimeout (int)
Poller 의 selector() 메소드 타임아웃 밀리초 시간 (기본값: 1000 - 1초)

Connection 의 (clean up)정리가 같은 Thread 에서 수행되므로 이 값을 너무 높게 설정하지 않는것을 권장한다.
useSendfile (boolean)
sendfile 기능 활성화 여부 설정 (기본값: true)
주의: sendfile 사용 시 Tomcat 의 Response 수행 시 압축 기능이 비활성화 된다.
socket.directBuffer (boolean)
Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false)

true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당
false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당

DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다.
예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장
socket.directSslBuffer (boolean)
SSL 버퍼에 대해서 Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false)

true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당
false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당

DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다.
예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장
socket.appReadBufSize (int)
각 Connection 의 (Read) 읽기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB)

동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다.
socket.appWriteBufSize (int)
각 Connection 의 (Write) 쓰기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB)

동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다.

주의: 기본값이 다소 낮으므로, 수만개 이상의 동시 접속이 아닌경우 값을 증가하는것을 권장함.
socket.bufferPool (int)
NIOx Connector 의 채널 객체(NioXChannel) 캐시 사이즈 설정 (기본값: -2)

0 : 캐시 없음
-1 : 무제한 캐시
-2 : bufferPoolSize 속성을 기반으로 캐시 사이즈를 자동으로 계산
socket.bufferPoolSize (int)
NioXChannel Pool 사이즈 설정 (값은 아래의 특수값이 아니라면 바이트 설정값이다.)
bufferPool 속성이 -2 값이 아니면 이 값은 사용되지 않는다.

[특수 값]
0 : 캐시 없음
-1 : 무제한 캐시
-2 : 자동 계산

[자동 계산]
NioXChannel 버퍼 크기 = 읽기 버퍼 크기 + 쓰기 버퍼 크기
SecureNioXChannel 버퍼 크기 = 애플리케이션 읽기 버퍼 크기 + 애플리케이션 쓰기 버퍼 크기 + 최대 SNI 구문 분석 크기의 두 배
(런타임에서 보고한 최대 메모리가 1GB보다 크면 풀 크기 값은 메모리를 버퍼 크기로 나눈 값이며, 그렇지 않으면 0 이 된다.)
socket.processorCache (int)
캐시에 보관할 SocketProcessor 객체 최대 값 (기본값: 0 - 캐시 없음)
-1 설정 시 무제한 캐시
socket.eventCache (int)
캐시에 보관할 PollerEvent 객체 최대 값 (기본값: 0 - 캐시 없음)
-1 설정 시 무제한 캐시
unixDomainSocketPath Unix 도메인 소켓이 지원되는 경우, 이 Connector 가 생성할 수신 대기할 소켓의 경로를 설정한다.
설정 시 port 속성은 생략 가능 (자세한 내용은 아래 [특수기능]-4. Unix 도메인 소켓 지원 내용 참고)

추가정보 - JDK 16 이상에서 지원됨
unixDomainSocketPathPermissions unixDomainSocketPath 설정의 Unix 도메인 소켓의 POSIX 권한을 설정한다. (기본값: rw-rw-rw-, 모든 사용자에 대해 읽기쓰기 가능)

권한형식: rwxrwxrwx 형태의 문자열 9자리 (소유자/그룹/기타사용자 권한)
r : 읽기
w : 쓰기
x : 실행
- : 권한 없음
useInheritedChannel (boolean)
Connector 가 inetd/systemd 네트워크 소켓을 상속해야 하는지 여부 (기본값: false)

단 하나의 커넥터만 네트워크 소켓을 상속 가능하며, systemd 슈퍼데몬의 포트에서 연결 요청이 들어올 때 자동으로 Tomcat 이 시작됨. (java.nio.channels.spi.SelectorProvider 클래스에 대한 JavaDoc 참고)


5. NIO2 전용 속성

- 다음 속성은 NIO2 Connector 에만 해당한다.

속성 설명
useSendfile (boolean)
sendfile 기능 활성화 여부 설정 (기본값: true)
주의: sendfile 사용 시 Tomcat 의 Response 수행 시 압축 기능이 비활성화 된다.
socket.directBuffer (boolean)
Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false)

true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당
false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당

DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다.
예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장
socket.directSslBuffer (boolean)
SSL 버퍼에 대해서 Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false)

true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당
false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당

DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다.
예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장
socket.appReadBufSize (int)
각 Connection 의 (Read) 읽기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB)

동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다.
socket.appWriteBufSize (int)
각 Connection 의 (Write) 쓰기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB)

동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다.

주의: 기본값이 다소 낮으므로, 수만개 이상의 동시 접속이 아닌경우 값을 증가하는것을 권장함.
socket.bufferPool (int)
NIO2 Connector 에서 Nio2Channel 객체 캐시 사이즈 설정 (기본값: 500)

0 : 캐시 없음
-1 : 무제한 캐시
socket.processorCache (int)
캐시에 보관할 SocketProcessor 객체 최대 값 (기본값: 0 - 캐시 없음)
-1 설정 시 무제한 캐시



[ 중첩 구성 요소 ]

- Tomcat 은 서버이름표시 (SNI - Server Name Indication)를 지원한다.
- 이를통해 단일 Secure_Connector 에 대해서 여러개의 SSL 설정을 연결할 수 있으며, 클라이언트가 요청한 호스트 이름에 따라 적절한 SSL 설정이 적용된다.

- 이 기능을 위해 SSLHostConfig 요소가 추가되었으며 이를 사용하여 각각의 SSL 설정을 정의할 수 있다.

- 하나의 Connector 요소의 내부에 여러개의 SSLHostConfig 요소 사용 가능
- 하나의 SSLHostConfig 요소의 내부에 여러개의 (SSL인증서 설정) Certificate 요소 사용 가능

- 자세한 내용은 아래의 5. SSL 지원 섹션을 참고


- 하나의 SSLHostConfig 요소 내부에 하나의 OpenSSLConf 요소 사용 가능
- 하나의 OpenSSLConf 요소 내부에 여러개의 OpenSSLConfCmd 요소 사용 가능 (TLS 구현을 제공하는 OpenSSL 을 사용하는 경우에만, OpenSSL의 SSL_CONF API 를 통해 OpenSSL을 구성하기 위해)

- 자세한 내용은 아래의 6. SSL 지원 - SSLHostConfig 속성 섹션을 참고



[ 특수 기능 ]

1. HTTP/1.1 및 HTTP/1.0 지원

- 이 Connector 는 RFC 7230~7235 에서 정의된 HTTP/1.1 프로토콜의 필수 기능을 모두 지원하며 아래와 같은 기능이 포함된다.
 1) 영속적 연결 (Persistent Connections)
 2) 파이프라이닝 (Pipelining)
 3) 기대 헤더 (Expectations)
 4) 청크 인코딩 (Chunked Encoding)

- 클라이언트가 HTTP/1.0 또는 HTTP/0.9 만 지원하는 경우 특별한 설정 없이 해당 프로토콜을 자동으로 지원한다.

- RFC 7230 에 따르면, HTTP 서버는 응답을 보낼 때 자신이 지원하는 최고 버전의 HTTP를 사용해야 하므로 이 Connector 는 항상 응답의 시작 시 HTTP/1.1 버전을 반환한다.


2. HTTP/2 지원

- 이 Connector 는 다양한 방식의 HTTP/2 연결을 지원한다.
 1) TLS (암호화된 HTTP/2, h2)
 2) HTTP 업그레이드 (비암호화 HTTP/2, h2c)
 3) 다이렉트 HTTP/2 연결 (h2c)

- HTTP Connector 에서 HTTP/2 지원을 활성화 하려면 아래와 같이 UpgradeProtocol 요소를 추가해야 한다.

<Connector ... >
  <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>

- 추가적인 설정이 필요하다면 HTTP/2 업그레이드 프로토콜 문서 참고


3. Proxy 지원

- (앞단에 WEB서버와 같이 Proxy 서버가 있고) Tomcat 이 Proxy 서버 뒤에서 실행되는경우 ProxyNameproxyPort 속성을 설정할 수 있다.
- 이는 웹 애플리케이션이 절대URL 및 리디렉션을 생성할 때 중요한 역할을 하는 request.getServerName()request.getServerPort() 메소드 반환값을 변경할 수 있다.

- 이런 속성을 설정하지 않으면 클라이언트가 원래 요청을 보냈던 (WEB 서버과 같은) Proxy 서버의 이름과 포트가 아닌 Proxy 서버에서 연결을 받은 (Tomcat 의) 서버 이름과 포트 정보가 반환된다 (이렇게 되면 클라이언트가 원래 요청을 보냈던 대상과 달라진다)

- 자세한 내용은 Proxy 지원 방법 문서 참고


4. Unix 도메인 소켓 지원

unixDomainSocketPath 속성을 사용하면 Unix Domain Socket 을 지원하는 Connector 가 해당 경로의 소켓에 반인딩 된다.
 1) JDK 16 이상 : NIO Connector 에서 지원이 제공된다.
 2) JDK 이전버전(Tomcat_10 문서) : Apache Tomcat Native 라이브러리 v1.2.26 이상 및 Apache Tomcat Runtime v1.6 이상과 함께할경우 org.apache.coyote.http11.Http11AprProtocol Connector 를 통해 제공된다.

- 소켓 보호를 위한 권한 설정
 1) 소켓 경로는 모든 사용자가 읽기/쓰기 가능한 상태로 생성된다.
 2) 보안을 위해 소켓을 특정 디렉토리에 배치하고 적절한 권한을 설정하는 것을 권장
 3) unixDomainSocketPathPermissions 속성을 사용하여 POSIX 권한 직접 설정 가능

- 소켓 자동 삭제 및 충돌 방지
 1) Tomcat 은 서버 종료 시 소켓을 자동으로 종료한다.
 2) Tomcat 시작 시 해당 소켓이 이미 존재하면 Tomcat 이 시작되지 않는다.
 3) 관리자는 기존 Tomcat 프로세스가 소켓을 사용하고 있지 않은지 확인 후 수동으로 제거해야 한다.

- 유닉스 도메인 소켓 접근 방법
 1) cURL 사용 : curl --unix-socket /경로/소켓.sock http://localhost/
 2) Apache HTTP 서버의 mod_proxy 모듈을 통해 접근 가능


5. SSL 지원

- 특정 Connector 에서 SSL을 활성화 하려면 SSLEnabled 속성을 true 로 설정하고, Servlet 에 올바른 정보를 전달하려면 scheme 와 secure 에 각각 https 및 true 값으로 설정한다.

<Connector SSLEnabled="true" scheme="https" secure="true" ... />


- NIO 및 NIO2 Connector 는 다음 두가지 SSL 구현을 지원한다.
 1) JSSE(Java Secure Socket Extension - Java SSL) 구현
 2) OpenSSL 구현

- 각 Securr_Connector 는 하나 이상의 SSLHostConfig 를 정의해야 한다.
 1) SSLHostConfig 요소의 hostName 은 고유해야 한다.
 2) 최소한 하나의 SSLHostConfig 요소의 hostName 속성은 defaultSSLHostConfigName 속성과 일치해야 한다.

- 각 SSLHostConfig 는 하나 이상의 Certificate 요소를 포함해야 한다.
 1) Certificate 요소 내에서 각 인증서의 type 속성은 고유해야 한다.

- Servlet 스펙 3.10 섹션에 정의된 TLS 관련 Request 속성 외에도 Tomcat 은 여러 추가 TLS 관련 속성을 지원하며, 전체 목록은 SSLSupport Javadoc 참고

- 자세한 내용은 SSL 구성방법 문서 참고


6. SSL 지원 - SSLHostConfig 속성

- SSLHostConfig 요소의 예제는 아래와 같으며 속성은 아래 표를 참고

<!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    port="8443"
    maxThreads="150"
    SSLEnabled="true" >
  <SSLHostConfig>
    <Certificate
        certificateKeyFile="conf/localhost-rsa-key.pem"
        certificateFile="conf/localhost-rsa-cert.pem"
        certificateChainFile="conf/localhost-rsa-chain.pem"
        type="RSA"
        />
  </SSLHostConfig>
</Connector>


속성 설명
certificateRevocationListFile 인증 기관의 인증서폐기목록(CRL)이 포함된 PEM 형식의 파일의 이름을 지정한다.

(OpenSSL 기반 커넥터가 사용되고 certificateRevocationListPath 가 정의되지 않은경우) 이 속성이 정의되지 않으면 클라이언트 인증서가 CRL 에 대해 확인되지 않는다.

상대경로는 $CATALINA_BASE 를 기준으로 확인되며, JSSE 기반 Connector 는 URL을 지정할수도 있다.
certificateRevocationListPath OpenSSL 전용

인증기관의 CRL 이 포함된 디렉토리의 이름을 지정한다.
파일은 PEM 형식이며, 상대경로는 $CATALINA_BASE 기준이다.
certificateVerification 클라이언트가 연결을 요청할 때 유효한 인증서 체인을 요구할지 설정 (기본값: none)

- required : 클라이언트가 유효한 인증서를 제공해야 한다.
- optional : 클라이언트 인증서를 요청하지만, 제공되지 않아도 연결을 허용한다.
- optionalNoCA : 클라이언트 인증서를 요청하지만, OCSP 비활성화 (신뢰할 수 있는 CA 목록과 대조하지 않는다.)
- none : 클라이언트가 인증서를 제공할 필요 없음, 단 CLIENT-CERT 인증을 요구하는 보안제약조건이 있을경우 예외 발생

TLS 공급자가 이 옵션을 지원하지 않는경우(OpenSSL은 지원하지만 JSSE는 지원하지 않음) optional 이 지정된 것처럼 처리됨
certificateVerificationDepth 클라이언트 인증서를 검증할 때 허용할 수 있는 중간 인증서 최대 개수 (기본값: 10)
caCertificateFile OpenSSL 전용

PEM 형식의 신뢰할 수 있는 인증기관의 인증서가 포함된 파일이름 지정
caCertificatePath OpenSSL 전용

PEM 형식의 파일이 있는 신뢰할 수 있는 인증 기관의 인증서가 포함된 디렉토리 이름
ciphers 사용할 Cipher Suite 를 지정한다. (기본값: HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!kRSA, OpenSSL 표기법)

OpenSSL 또는 JSSE의 표준 암호화 스위트 이름을 사용할 수 있으며, 암호화 우선순위를 서버가 강제하려면 honorCipherOrder 속성을 설정해야 한다.

* 원문내용 요약함 *
disableCompression OpenSSL 전용

압축 비활성화 여부 구성 (기본값: true)
사용중인 OpenSSL 버전이 압축 비활성화 지원하지 않는경우 해당 OpenSSL 버전의 기본값 사용됨.
disableSessionTickets OpenSSL 전용

TLS 세션 티켓(RFC 5077) 비활성화 여부 구성 (기본값: false)

* 원문내용 요약함 *
honorCipherOrder 클라이언트가 암호를 선택 허용하는게 아닌 (ciphers 에 설정한)서버의 암호 순서 적용 여부 (기본값: false)
hostName SSL Host 의 도메인 이름을 지정 (기본값: _default_)

(tomcat.apache.org) FQDN 형식의 도메인 이거나 (*.apache.org) 와일드카드 도메인 이름이어야 한다.
insecureRenegotiation OpenSSL 전용

보안이 취약한 재협상을 허용할지 여부 설정 (기본값: false)

사용된 OpenSSL 버전이 취약한 재협상을 지원하지 않는경우 해당 OpoenSSL 버전의 기본값이 사용된다.
keyManagerAlgorithm JSSE 전용

사용할 KeyManager 알고리즘을 지정 (기본값: JVM 에 따라 다름)

- Sun_JVM : SunX509 를 반환하는 KeyManagerFactory.getDefaultAlgorithm()
- IBM_JVM : IbmX509
- 등등_JVM
protocols 사용할 SSL/TLS 프로토콜을 지정한다. (기본값: all)

- 조합 가능 목록 : SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3, all
- + 또는 - 기호를 사용하여 특정 프로토콜을 추가 또는 제거할 수 있음.
- all 값은 SSLv2Hello,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 의 별칭
- TLSv1.3 은 JSSE 에서 JVM 이 지원하는 경우에만 사용 가능
- SSLv2SSLv3 은 보안상 안전하지 않음.

(중요하지 않음)
- SSLv2Hello 는 OpenSSL 기반 Secure Connector 에서 protocol 속성에 두개 이상의 프로토콜을 지정하면 SSLv2Hello 값이 없더라도 자동으로 활성화 되지만 하나의 프로토콜을 지정하면 SSLv2Hello 라고 명시적으로 지정해도 무시되며 적용되지 않는다.
revocationEnabled JSSE 전용

JSSE 공급자에서 인증서 폐기 검사를 활성화 할지 여부 설정 (기본값: false)

certificateRevocationListFile 속성이 설정된 경우 이 속성은 무시되고 폐기 검사는 항상 활정화 된다.
이 속성은 다른 수단을 통해 현재 JSSE 공급자에 대해 구성된 해지 체크를 사용하도록 위한것이다.
sessionCacheSize 캐시에 유지할 SSL 세션의 최대 개수 (기본값: -1, 구현체 기본값)

1) -1 : SSL 세션을 캐시에 유지하지 않음
2) 0 : 무제한 캐시 사이즈 (권장하지 않음)
3) 정수값 : 설정할 캐시 사이즈
sessionTimeout SSL 세션의 만료 (초)시간 (기본값: 86400 - 24시간)

1) -1 : SSL 세션 만료 시간 없음 (구현체 기본값)
2) 0 : 무제한 캐시 사이즈 (권장하지 않음)
3) 정수값 : 설정할 만료 시간 (초)
sslProtocol JSSE 전용

사용할 SSL 프로토콜 지정 (기본값: TLS)

단일값으로 여러 프로토콜을 활성화 할 수 있으며, SSLContext 인스턴스를 생성할 때 알고리즘의 값을 허용하고 Oracle_Java_11 문서 참고.
protocol 속성과 겹치는 부분이 있다.
trustManagerClassName JSSE 전용

클라이언트 인증서를 검증할 커스텀 TrustManager 클래스 이름을 지정한다.

해당 클래스는 인수가 0개인 생성자가 있어야 하며, javax.net.ssl.X509TrustManager 도 구현해야 한다.
이 속성이 설정되어 있으면 truststore 속성이 무시될 수 있다.
truststoreAlgorithm JSSE 전용

Trust Store 에서 사용할 알고리즘 지정 (기본값: javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm() 반환값)
truststoreFile JSSE 전용

클라이언트 인증서를 검증할 Trust Store 파일 지정 (기본값: javax.net.ssl.trustStore 시스템 속성값)

이 속성이나 기본 시스템속성값이 설정되지 않은경우 Trust Store 가 구성되지 않는다.
$CATALINA_BASE 을 상대경로로 사용, 이 속성에 URL 을 사용할 수 있다.
truststorePassword JSSE 전용

Trust Store 접근을 위한 비밀번호 설정 (기본값: javax.net.ssl.trustStorePassword 시스템 속성값)

이 속성이 null 이면 Trust Store 암호가 구성되지 않으며, 잘못된 암호를 지정 시 로그에 (warn)경고가 기록되고 암호 없이 Trust Store 에 엑세스 하려는 시도가 수행되어 Trust Store의 유효성 검사를 건너뛴다.
truststoreProvider JSSE 전용

서버 인증서에 사용할 Trust Store Provider 이름 (기본값: javax.net.ssl.trustStoreProvider 시스템 속성값)

이 속성이 null 이면 keystoreProvider 의 값이 기본값으로 사용된다.
이 속성, 시스템속성, keystoreProvider 가 모두 설정되지 않은경우 등록된 (Provider)공급자 목록이 기본 순서대로 탐색되고 stuststoreType 을 지원하는 첫번째 공급자가 사용된다.
truststoreType JSSE 전용

Trust Store 에 사용되는 (Key Store)키 저장소 Type 지정 (기본값: javax.net.ssl.trustStoreType 시스템 속성값)

아래의 조건을 모두 충족하면 기본값은 JKS 이다.
 1) 이 속성이 null 이고
 2) 이 TLS 가상 호스트에 대해 단일 인증서가 구성 되고
 3) 해당 인증서에 PKCS12 가 아닌 keystoreType이 있는 경우
 4) 기본값은 단일 인증서의 keystoreType 이지만 이러한 기본값 중 어떤것도 식별하지 못하는경우


7. SSL 지원 - Certificate 속성

- Certificate 요소의 예제는 아래와 같으며 속성은 아래 표를 참고

<!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    port="8443"
    maxThreads="150"
    SSLEnabled="true" >
  <SSLHostConfig>
    <Certificate
        certificateKeyFile="conf/localhost-rsa-key.pem"
        certificateFile="conf/localhost-rsa-cert.pem"
        certificateChainFile="conf/localhost-rsa-chain.pem"
        type="RSA"
        />
  </SSLHostConfig>
</Connector>


속성 설명
certificateFile PEM 형식의 서버 인증서 파일의 이름이며 certificateKeystoreFile 속성이 지정되지 않은경우 필수이다.
상대경로 사용 시 $CATALINA_BASE 기준으로 한다.

해당 파일은 선택사항으로 DH_파라미터 / (임시키를위한) EC_커브이름을 포함할 수 있다.
(각각 openssl dhparamopenssl ecparam 으로 생성할 수 있고 출력결과를 파일 내용에 추가하면 된다.)
certificateChainFile PEM 형식의 서버 인증서와 연결된 인증서 체인 파일의 이름이며 상대경로 사용 시 $CATALINA_BASE 기준으로 한다.

Tomcat 에서 사용하는 인증서 체인에는 서버 인증서를 첫번째 요소로 포함하지 않아야 하며, 여러 유형의 인증서를 사용할 경우 모든 인증서가 동일한 인증서 체인을 사용해야 한다.
certificateKeyAlias JSSE 전용

(Key Store)키 저장소에서 서버키와 인증서에 사용되는 별칭이다.

미지정 시 키 저장소에서 읽은 첫번째 키가 사용된다. 키가 읽히는 순서는 구현방식에 따라 다를 수 있으며, 키 추가 순서와 다를 수 있다.
키 저장소에 여러 키가 있는경우 올바를 키가 사용되도록 KayAlias 를 설정하는것을 권장함.
certificateKeyFile PEM 형식의 서버 (private)개인키 파일의 이름이며, 상대경로 사용 시 $CATALINA_BASE 기준으로 한다.

기본값은 certificateFile 속성의 값이며, 이경우 인증서와 개인키 모두 이 파일에 있어야 한다. (권장하지 않음)
certificateKeyPassword 서버 인증서와 연결된 개인키에 접근하기 위한 비밀번호

미지정 시 JSSE 의 기본동작은 certificateKeystorePassword 를 사용하고 OopenSSL 은 기본적으로 비밀번호를 사용하지 않지만 필요 시 프롬프트로 요청을 한다.
certificateKeyPasswordFile 서버 인증서와 연결된 개인키에 접근하기 위한 비밀번호를 포함하는 파일이며 이 속성은 certificateKeyPassword 속성보다 우선 적용된다.

미지정 시 JSSE 의 기본동작은 certificateKeystorePassword 를 사용하고 OopenSSL 은 기본적으로 비밀번호를 사용하지 않지만 필요 시 프롬프트로 요청을 한다.
certificateKeystoreFile JSSE 적용

서버 인증서와 키를 저장한 (Key Store)키 저장소 파일의 경로 (기본값: Tomcat 을 실행중인 사용자 홈디렉토리의 .keystore 파일)

certificateFile 속성이 지정되지 않은경우 필수 입력 속성이며, 상대경로 사용 시 $CATALINA_BASE 기준이고 URI 사용이 가능하다.
certificateKeystoreType 속성이 파일을 필요로 하지 않는경우 ""(빈문자열) 또는 NONE 을 사용할 수 있다.

certificateKeystoreType 속성이 DKS(도메인 키 저장소)를 사용하는경우 이 속성값은 도메인 키 저장소의 URI를 지정해야 한다.
certificateKeystorePassword JSSE 전용

서버의 개인 키와 인증서가 포함된 키 저장소에 접근하기위한 비밀번호 (기본값: changeit)
certificateKeystorePasswordFile JSSE 전용

키 저장소에 접근하기 위한 비밀번호가 저장된 파일이며, 이 속성은 certificateKeystorePassword 보다 우선 적용된다.
certificateKeystoreProvider JSSE 전용

서버 인증서에 사용할 (Key Store)키 저장소의 (Provider)공급자의 이름

이 속성을 지정하지 않은경우 javax.net.ssl.keyStoreProvider 시스템 속성이 사용되며, 둘다 지정되자 않은경우 등록된 Provider 목록을 탐색하여 keystoreType 을 지원하는 첫번째 Provider 가 사용된다.
certificateKeystoreType JSSE 전용

서버 인증서에 사용할 키 저장소 파일 유형

이 속성을 지정하지 않으면 javax.net.ssl.keyStoreType 시스템 속성이 사용되며, 둘다 지정되지 않은경우 기본값으로 JKS 가 사용된다.
자세한 내용은 아래 10. 키 저장소(Key store) 유형 참고
type 인증서 유형이며 인증서와 호환되는 암호화 방식(ciphers)를 식별하는데 사용되고 UNDEFINED, RSA, DSA, EC 중에 하나의 값을 지정한다.

SSLHostConfig 요소 내부에 하나의 Certificate 요소만 있는경우 이 속성은 필요하지 않으며 기본적으로 UNDEFINED 로 설정된다.
여러 Certificate 요소가 있는경우 각각의 고유한 type 을 지정해야 한다.


8. SSL 지원 - Connector - NIO 및 NIO2

- APR/native 가 활성화되면 Connector 는 기본적으로 JSSE(Java SSL) 을 통해 OpenSSL 을 사용하도록 설정된다.
- 이는 사용중인 프로세서에 따라 JSSE의 Java 구현보다 최적화 될 수 있으며, 다양한 상용 가속기 구성요소와 함께 사용할 수 있다.

- OpenSSL FFM 지원이 활성화된 경우, Connector 는 (Java 22의 FFM API를 통해 OpenSSL 에 접근하여) JSSE를 통해 OpenSSL 을 사용하는 방식으로 기본 설정된다.

- 다음 NIO/NIO2 SSL 속성은 가상 호스트에 국한되지 않으므로 Connector 에서 설정해야 한다.

속성 설명
sniParseLimit 클라이언트가 보내는 첫번째 TLS 메시지 파싱을 위한 버퍼 크기 (기본값: 65536 - 64KB)

(Server Name Indication) SNI 지원을 위해 새로운 TLS 연결(client hello)에서 수신된 첫번 째 TLS 메시지를 구문분석하여 요청된 서버 이름을 추출해야 하며 이 메시지는 JSSE 구현으로 전달하기위해 버퍼링 되어야 한다.
첫번째 메시지는 이론적으로 매우 클 수 있지만 일반적으로 수백바이트 정도이다.
메시지 크기가 이 한도를 초과하면 해당 연결은 클라이언트가 서버 이름을 지정하지 않은것으로 간주한다.
sslImplementationName 사용할 SSL 구현체 클래스 이름을 지정한다.

1. 미설정 시
 - tomcat-native 라이브러리 미설치 상황
 - 기본값: org.apache.tomcat.util.net.jsse.JSSEImplementation - JVM의 기본 JSSE Provider 를 래핑함
 - JVM 이 기본 JSSE Provider 를 다르게 설정할 수 있음

2. OpenSSL 사용 시
 - Tomcat 에 OpenSSL을 지원하는 JSSE 기반의 특별한 SSL 구현체가 포함되어 있음
 - native 라이브러리가 활성화되면 Tomcat 은 이를 자동으로 활성화 한다.
 - 기본값: org.apache.tomcat.util.net.openssl.OpenSSLImplementation

3. Java 22의 FFM API 사용 시
 - 기본값: org.apache.tomcat.util.net.openssl.panama.OpenSSLImplementation
 - 이 경우 JSSE 및 OpenSSL 구성 스타일의 속성을 모두 사용할 수 있지만 두가지 유형을 혼합하여 사용할수 없다.
 - 예) Java 키 저장소를 정의한 뒤, 별도의 PEM 개인키를 OpenSSL 속성으로 지정하는 것은 허용하지 않는다.


9. SSL 지원 - OpenSSL 의 SSL_CONF API

- SSLHostConfig 요소 안에 하나의 OpenSSLConf 요소를 (중첩)추가 할 수 있다.
- (OpenSSL 이 TLS 구현을 제공하는경우) OpenSSLConf 요소 안에 여러개의 OpenSSLConfCmd 요소를 추가할수 있다.
- OpenSSLConfCmd 요소를 추가하여 OpenSSL 의 SSL_CONF API 를 통해 OpenSSL 을 구성할 수 있다.

- 사용가능한 구성파일 명령 세트는 사용중인 OpenSSL 버전에 따라 다르다.
- 지원하는 명령 이름 및 값 목록은 OpenSSL 에 대한 SSL_CONF_cmd(3) 문서의 "SUPPORTED CONFIGURATION FILE COMMANDS" 섹션을 참고한다.
- 일부 구성파일 명령은 SSLHostConfig 속성의 대안으로 사용할 수 있다. (SSLHostConfig 속성으로 구성할 수 없는 기능에 대해서만 사용할것을 권장한다.)


- OpenSSLConfg 요소는 속성을 지원하지 않는다.

- OpenSSLConfCmd 요소는 아래 속성을 지원한다.

속성 설명
name 구성 파일 명령의 이름
value 구성 파일 명령의 값


10. 키 저장소(Key store) 유형

- 표준 키 저장소 유형(JDS 및 PKCS12) 외에도 대부분의 Java 런타임은 Windows-ROOT, Windows-My, DKS 및 하드웨어 보안모듈(HSM-Hardware Security Modules) 과 같은 추가 키스토어 유형을 지원한다.


- 이러한 추가 키 스토어 유형을 사용하려면 다음과 같이 구성해야 한다.
 1) 필요한 키 스토어 유형 설정
  - Connector의 certificateKeystoreType 및/또는 truststoreType 속성을 적절한 유형으로 설정
 2) 구성 파일이 필요한 경우
  - Connector의 certificateKeystoreFile 및/또는 truststoreFile 속성을 설정하여 해당 구성 파일을 가리키도록 한다.
 3) 구성 파일이 필요하지 않은 경우
  - 대부분의 경우 certificateKeystoreFile 및/또는 truststoreFile 속성을 빈 문자열("")로 명시적으로 설정한다.
 4) 비밀번호가 필요한 경우
  - certificateKeystorePassword 및/또는 truststorePassword 속성을 필요한 비밀번호로 설정한다.
 5) 비밀번호가 필요하지 않은 경우
  - 대부분의 경우 certificateKeystorePassword 및/또는 truststorePassword 속성을 빈 문자열("")로 명시적으로 설정한다.


- 키 저장소 구현의 차이점과 Tomcat 이 JSSE 및 OpenSSL 구성 스타일간의 상호 운용성을 위해 백그라운드에서 수행하는 키 저장소 조작으로 인해 일부 키 저장소는 약간 다른 구성이 필요할 수 있다.
- 이런경우 Apache Tomcat 사용자 메일링 리스트 에서 도움 받을 수 있다.


11. Connector 비교

- 아래는 Connector 별로 어떻게 다른지 나타낸다.

Java Nio Connector
NIO
Java Nio2 Connector
NIO2
APR/native Connector
APR
(deprecated)
ClassnameHttp11NioProtocolHttp11Nio2ProtocolHttp11AprProtocol
Tomcat Versionsince 6.0.xsince 8.0.xsince 5.5.x
Support PollingYESYESYES
Polling SizemaxConnectionsmaxConnectionsmaxConnections
Read Request HeadersNon BlockingNon BlockingNon Blocking
Read Request BodyBlockingBlockingBlocking
Write Response Headers and BodyBlockingBlockingBlocking
Wait for next RequestNon BlockingNon BlockingNon Blocking
SSL SupportJava SSL or OpenSSLJava SSL or OpenSSLOpenSSL
SSL HandshakeNon blockingNon blockingBlocking
Max ConnectionsmaxConnectionsmaxConnectionsmaxConnections


참고
 - https://tomcat.apache.org/tomcat-11.0-doc/config/http.html


댓글