사용자 도구

사이트 도구


java:tomcat

Tomcat

다중 도메인 Session

  • 다중 서브 도메인에 대해서 Session 쿠키를 설정해야할 필요가 있을 때가 있다. (a.example.com, b.example.com, …)
  • 6.0.xx 최신에서는 server.xml 혹은 context.xml 등의 Context 설정을 변경한다. Tomcat Config Context 참조.
<Context sessionCookieDomain=".example.com">
...
</Context>
  • 구버전에서는 Valve를 사용한다. 참조
  • sessionCookieDomain, sessionCookiePath, sessionCookieName 등을 지정하여 쿠키의 경로, 이름등을 변경할 수 있다.

catalina.sh

  • 주요 환경변수
    • CATALINA_HOME
    • CATALINA_BASE
    • CATALINA_OUT : 기본 $CATALINA_BASE/logs/catalina.out
    • CATALINA_OPTS : 톰캣 실행시 JVM 옵션
    • CATALINA_TMPDIR : java.io.tmpdir값 변경. 기본 $CATALINA_BASE/temp
    • JAVA_OPTS
    • CATALINA_PID : *nix에서 프로세스 강제 종료시 사용할 PID 값을 저장하는 파일 지정 -force 옵션 사용시 필수
  • 명령행 인자
    • run : 현재 창에서 톰캣 실행
    • start : 새 창(혹은 백그라운드)에서 톰캣 실행
    • stop n -force : 톰캣을 종료하고 n초 기다렸다가 프로세스가 살아있으면 $CATALINA_PID 정보 기준으로 프로세스 KILL

Session Clustering

Tomcat 6.0.10 이상부터 / \ 이상 동작

  • http://tomcat.apache.org/security-6.html#Fixed_in_Apache_Tomcat_6.0.10
    Important: Directory traversal CVE-2007-0450
    
    Tomcat permits '\', '%2F' and '%5C' as path delimiters. When Tomcat is used behind a proxy (including, but not limited to, Apache HTTP server with mod_proxy and mod_jk)
     configured to only proxy some contexts, a HTTP request containing strings like "/\../" may allow attackers to work around the context restriction of the proxy,
     and access the non-proxied contexts.
    
    The following Java system properties have been added to Tomcat to provide additional control of the handling of path delimiters in URLs (both options default to false):
    
        org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH: true|false
        org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH: true|false
    
    Due to the impossibility to guarantee that all URLs are handled by Tomcat as they are in proxy servers,
    Tomcat should always be secured as if no proxy restricting context access was used. 

UTF-8 Charset/Encoding

  • server.xml Connector에 URIEncodign=“UTF-8” 지정
  • Spring 사용시 org.springframework.web.filter.CharacterEncodingFilter로 필터 적용

Tomcat 7.0.54 ClassLoader memory leak

  • Tomcat 7.0.54 버전의 클래스로더가 일부 jar 를 로딩하는동안 Annotation 분석하다가 EOFException과 Memory Leak 일 발생한다.
    SEVERE: Unable to process Jar entry [com/ctc/wstx/api/ReaderConfig.class] from Jar [jar:jndi:/localhost/ssms-gui/WEB-INF/lib/woodstox-core-asl-4.1.2.jar!/] for annotations
    java.io.EOFException
  • 특히 MyBatis 3.4.0 버전에서 발생하였으며, Tomcat을 버전업하면 해결된다.

RemoteIPValve

  • RemoteIpValve 프록시를 제거한 원본 요청 Remote IP 를 HttpServletRequest.remoteAddr로 남겨주는 value
  • server.xml
    <Valve className="org.apache.catalina.valves.RemoteIpValve"
                   remoteIpHeader="X-Forwarded-For"
                   requestAttributesEnabled="true"
                   internalProxies="127\.0\.0\.1"  />
  • nginx
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  • SpringBoot 사용시에는 다음 프라퍼티 설정이 있으면 RemoteIpValue가 자동 활성화된다.
    server.tomcat.remote_ip_header=x-forwarded-for
  • SpringBoot 사용시에는 다음 프라퍼티 설정이 있어야 redirect 시에 protocol을 올바로 판단할 수 있다.
    server.tomcat.protocol_header=x-forwarded-proto

Realm

Slf4j & Logback

java/tomcat.txt · 마지막으로 수정됨: 2019/06/19 13:26 저자 kwon37xi