제2장 WebtoB 4.1 SP9 Fix#1

내용 목차

2.1. 신규 기능
2.1.1. USERLOGFORMAT 절 신규 생성
2.1.2. SERVER 절에 Options 설정
2.1.3. Term 타입의 라이선스 체크
2.1.4. Window 서비스를 사용할 때 WSM이 죽은 경우 서비스 종료
2.1.5. Response size를 기준으로 compression 여부 판단
2.1.6. NODE 절에 RPAHeader 설정
2.1.7. PROXY_SSL 절에 CertificateChainFile 설정
2.1.8. NODE 절에 TimeOutStatus 설정
2.1.9. TLS extension - SNI 기능
2.1.10. Cloud 타입의 license에 만료일을 추가
2.2. 추가 기능
2.2.1. Accesslog format에 "%S" 설정 추가
2.3. 변경 기능
2.3.1. WBSSL 버전 업그레이드
2.3.2. SSL을 사용하는 경우 RequiredCiphers 기본값 변경
2.3.3. 최대 Dynamic header 수를 30에서 60으로 증가
2.4. 버그 패치
2.4.1. Reverse proxy에서 Pipeline Request 처리 중 core 발생 버그 수정
2.4.2. syslog에 HTH0202 로그와 HTH0031 로그가 반복되며 CPU 점유율이 높아지는 문제
2.4.3. IndexName이 HTML 타입이 아닌 요청에 Body가 큰 경우 CPU 점유율이 높아지는 문제
2.4.4. Response header에 'Expires'를 추가하던 중에 PHPS/CGIS core가 발생할 수 있는 문제
2.4.5. Filter에서 302 응답이 생성된 경우 Accesslog에 status code가 0인 문제
2.4.6. Filters process를 종료할 때 core가 발생할 수 있는 문제
2.4.7. JEUS로부터 register 메시지가 한번에 다 들어오지 않을 경우 발생할 수 있는 문제
2.4.8. filters 프로세스에서 Request header를 추가할 때 down될 수 있는 버그 수정
2.4.9. JSV Response를 Compression할 때 filters 프로세스에서 처리된 결과가 반영되지 않는 문제
2.4.10. ReverseProxy로 웹 소켓 사용할 때 FlowControl fail이 발생할 수 있는 문제
2.4.11. COPY Method로 호출하여 같은 파일명 overwrite할 때 에러 발생 버그 수정
2.4.12. PROPFIND Method로 호출할 때 실패할 수 있는 문제

2.1. 신규 기능

2.1.1. USERLOGFORMAT 절 신규 생성

  • 공통으로 사용될 로그 포맷을 설정할 수 있도록 *USERLOGFORMAT 절을 추가하였다.

    기존에 VHOST가 많을 경우에 같은 포맷을 설정하고자 할지라도 각각 설정해야 했으나, *USERLOGFORMAT 절에 사용자가 로그 포맷을 설정하고 *LOGGING 절에서 해당 설정 포맷을 사용할 수 있도록 하였다.

    [예 2.1] *USERLOGFORMAT 설정 방법

    *LOGGING
    log1        Format = "format1", FileName = "C:/TmaxSoft/WebtoB4.1.9.1/log/access.log",
                Option = "sync"
                ...
    *USERLOGFORMAT
    format1     Format = "%h %l %u %t \"%r\" %s %b" 
    

  • 관련이슈 : IMS-108609

2.1.2. SERVER 절에 Options 설정

  • FILTERS 프로세스에서 처리된 이후 요청을 JSV 서버(또는 다른 서버 프로세스)에 요청을 전달할 때 사용자로부터 받은 요청을 그대로 전달할 때 사용하는 기능이다.

    FILTERS 프로세스에서 처리되면서 URL 인코딩 등으로 요청 URL이 변경될 경우를 고려하여 사용될 수 있다.

    [예 2.2] *SERVER.Options 설정 방법

    *SERVER
    MyGroup      SvgName = jsvg, MinProc = 1, MAXProc = 10, 
                 Options = "PassOriginalUriAfterFilters"
    

  • 관련이슈 : IMS-100812

2.1.3. Term 타입의 라이선스 체크

  • 라이선스가 Term 타입인 경우 due date를 체크하도록 추가하였다.

2.1.4. Window 서비스를 사용할 때 WSM이 죽은 경우 서비스 종료

  • Windows 서비스에서 30초 간격으로 WSM 프로세스가 살아있는지 체크하여 죽은 경우 wsdown 및 서비스를 종료하도록 한다.

  • 관련이슈 : IMS-107294

2.1.5. Response size를 기준으로 compression 여부 판단

  • *SERVER.CompressionMinSize를 설정하는 경우 Content-Length(또는 file size)가 해당 설정 이상인 경우에만 compression이 적용되도록 한다.

    [예 2.3] *SERVER.CompressionMinSize 설정

    *SERVER
    html       SvgName = htmlg, MinProc = 2, MaxProc = 10, 
              CompressionMinSize = 1, Compression = "text/html"
    

  • 관련이슈 : IMS-107724

2.1.6. NODE 절에 RPAHeader 설정

  • *NODE.RPAHeader = "X-Forwarded-For"와 같이 설정하면, WebtoB로 들어오는 HTTP 요청에서 Proxy 등을 거치면서 변경된 Remote IP에 Proxy 서버의 IP가 아닌 원래 요청이 발생된 Host IP로 설정할 수 있다.

    [예 2.4] *NODE.RPAHeader 설정

    *NODE
    webtob      WEBTOBDIR = "/home/webtob_4191",
                SHMKEY = 54800,
                RPAFHeader = "X-Forwarded-For"
    

  • 관련이슈 : IMS-108918

2.1.7. PROXY_SSL 절에 CertificateChainFile 설정

  • PROXY_SSL 절에도 추가된 CertificateChainFile 설정을 통해 Chain을 생성할 수 있다. 내부 서버의 Certificate의 인증을 하기 위해서는 다음과 같이 PROXY_SSL 절에 CertificateChainFile을 설정한다.

    [예 2.5] *PROXY_SSL.CertificateChainFile 설정

    *PROXY_SSL
    reverseSsl Verify = 2,
               VerifyDepth = 3,
               CertificateChainFile = "$(WEBTOBDIR)/ssl/CHAIN.crt",
               CACertificateFile = "$(WEBTOBDIR)/ssl/CA.crt",
               CertificateFile = "$(WEBTOBDIR)/ssl/public.crt",
               CertificateKeyFile = "$(WEBTOBDIR)/ssl/private.key",
               Protocols = "-SSLv2, -SSLv3",
               RequiredCiphers = "HIGH:MEDIUM:!SSLv2:!PSK:!SRP:!ADH:!AECDH:!EXP:!RC4:!IDEA:!3DES"
    

  • 관련이슈 : IMS-107342

2.1.8. NODE 절에 TimeOutStatus 설정

  • TimeOut이 발생하는 경우 HTTP 상태코드를 변경할 수 있는 *NODE.TimeOutStatus 설정을 추가하였다. 기존에는 TimeOut이 발생할 경우 500 error가 발생하였으나, *NODE.TimeOutStatus 설정한 code 값으로 변경할 수 있다.

    [예 2.6] *NODE.TimeOutStatus 설정

    *NODE
    webtob      WEBTOBDIR = "/home/webtob_4191",
                SHMKEY = 54800,
                TimeOut = 300,
                TimeOutStatus = 512              # 500 (511-599) 
    

  • 관련이슈 : IMS-110816

2.1.9. TLS extension - SNI 기능

  • 기존에는 1개의 포트로 2개의 인증서를 서비스하기 위해서는 포트를 분리하거나, 멀티 도메인 인증서를 사용해야 했다. 신규 버전에서는 TLS의 확장 기능인 SNI 기능을 추가함으로써 1개의 포트로 여러 도메인을 서비스할 수 있게 되었다.

    [예 2.7] 1개의 port로 2개의 도메인을 서비스하는 방법

    *VHOST
    vhost1         DOCROOT = "C:/TmaxSoft/WebtoB4.1/vdocs1",
                   NODENAME = "tmax",
                   HOSTNAME = "192.168.0.0",
                   IndexName = "index.jsp",
                   ServiceOrder = "ext,uri",
                   #KeepAlive = N,
                   PORT = "7410",
                   SSLFLAG = Y,
                   SSLNAME = "ssl1"
    vhost2         DOCROOT = "C:/TmaxSoft/WebtoB4.1/vdocs1",
                   NODENAME = "tmax",
                   HOSTNAME = "192.168.0.0",
                   HostAlias = "vhost2.tmax.co.kr",
                   IndexName = "index.jsp",
                   ServiceOrder = "ext,uri",
                   PORT = "7410",
                   SSLFLAG = Y,
                   SSLNAME = "ssl2"
                   ...   
    *SSL
    ssl1            CertificateFile = "C:/TmaxSoft/WebtoB4.1/ssl/server.crt",
                    CertificateKeyFile = "C:/TmaxSoft/WebtoB4.1/ssl/server.key",
                    CertificateChainFile = "C:/TmaxSoft/WebtoB4.1/ssl/chain.crt",
                    RequiredCiphers = "AES256-SHA",
                    PassPhraseDialog = "exec:C:/TmaxSoft/WebtoB4.1/ssl/pass.bat"
    ssl2            CertificateFile = "C:/TmaxSoft/WebtoB4.1/ssl/server2.crt",
                    CertificateKeyFile = "C:/TmaxSoft/WebtoB4.1/ssl/server2.key",
                    CertificateChainFile = "C:/TmaxSoft/WebtoB4.1/ssl/chan2.crt",
                    RequiredCiphers = "RC4-MD5",
                    PassPhraseDialog = "exec:C:/TmaxSoft/WebtoB4.1/ssl/pass.bat"
    

    다음은 위 설정을 테스트하는 방법이다.

    $>wbssl s_client -connect 192.168.0.0:7410 -servername vhost2.tmax.co.kr
    RESULT> CONNECTED(00000160)
     ...
     New, TLSv1/SSLv3, Cipher is RC4-MD5
     Server public key is 1024 bit
     Secure Renegotiation IS supported
     Compression: NONE
     Expansion: NONE
     SSL-Session:
         Protocol  : TLSv1.2
         Cipher    : RC4-MD5
    
  • 관련이슈 : IMS-105573

2.1.10. Cloud 타입의 license에 만료일을 추가

  • 라이선스가 Cloud 타입이면서 expiration date를 체크하도록 추가하였다.

2.2. 추가 기능

2.2.1. Accesslog format에 "%S" 설정 추가

  • Accesslog format에 커넥션 구분에 따라 HTTP 또는 HTTPS를 기록할 수 있는 "%S" 설정을 추가하였다.

    [예 2.8] [예] Accesslog format = "%S" 설정

    *LOGGING
    log1        Format = "%h %S %l %u %t \"%r\" %s %b", 
                FileName = "C:/TmaxSoft/WebtoB4.1.9.1/log/access.log",
                Option = "sync"
    

  • 관련이슈 : IMS-110768

2.3. 변경 기능

2.3.1. WBSSL 버전 업그레이드

  • WBSSL의 버전을 기존의 "WBSSL 2.2.2"에서 "WBSSL 2.3.0_B0"로 업그레이드하였다.

    $>wbssl version
    WBSSL 2.3.0 B0 20 May 2016
  • 관련이슈 : IMS-106426

2.3.2. SSL을 사용하는 경우 RequiredCiphers 기본값 변경

  • RequiredCiphers의 기본값을 다음과 같이 변경하였다.

    • 변경 전

      RequiredCiphers = "HIGH:MEDIUM:!SSLv2:!PSK:!SRP:!ADH:!AECDH:!EXP"
    • 변경 후

      RequiredCiphers = "HIGH:MEDIUM:!SSLv2:!PSK:!SRP:!ADH:!AECDH:!EXP:!RC4:!IDEA:!3DES"
  • 관련이슈 : IMS-103369

2.3.3. 최대 Dynamic header 수를 30에서 60으로 증가

  • 기존 Dynamic header가 30개 이상일 경우 "Input header count is too many" 로그가 발생하여, 최대 Dynamic header 수를 30에서 60으로 증가하였다.

  • 관련이슈 : IMS-108490

2.4. 버그 패치

2.4.1. Reverse proxy에서 Pipeline Request 처리 중 core 발생 버그 수정

  • 클라이언트의 Pipelined Request를 처리할 때 앞선 요청 처리를 위해 뒷단의 내부 서버로 connecting 중일 때 해당 클라이언트의 상태를 RUN 상태로 유지하도록 수정하였다.

  • 관련이슈 : IMS-102899

2.4.2. syslog에 HTH0202 로그와 HTH0031 로그가 반복되며 CPU 점유율이 높아지는 문제

  • HTMLS를 kill하는 과정에서 해당 프로세스에 대해 두 번 close하려고 하는 부분으로 인한 문제를 수정하였다.

  • 관련이슈 : IMS-104842

2.4.3. IndexName이 HTML 타입이 아닌 요청에 Body가 큰 경우 CPU 점유율이 높아지는 문제

  • *NODE(VHOST).IndexName에 index.php이 설정되어 있는 환경에서 body가 큰 "POST /" 요청이 왔을 경우 예상보다 큰 redirect 메시지를 buffer에 담지 못하고 기다리는 동작을 반복하여 발생한 현상이다.

  • 관련이슈 : IMS-106208

2.4.4. Response header에 'Expires'를 추가하던 중에 PHPS/CGIS core가 발생할 수 있는 문제

  • 'Expires' Response header를 만들기 위해 Request uri를 가져오는 도중 core가 발생하는 문제를 수정하였다.

  • 관련이슈 : IMS-105697

2.4.5. Filter에서 302 응답이 생성된 경우 Accesslog에 status code가 0인 문제

  • Filters 프로세스에서 302 응답이 만들어질 때 클라이언트에게는 302 응답이 정상적으로 전달되지만, Accesslog에는 Response status code가 0으로 찍히는 문제를 수정하였다.

2.4.6. Filters process를 종료할 때 core가 발생할 수 있는 문제

  • Filters 프로세스를 wsdown으로 종료했을 경우에 core가 발생할 수 있는 문제를 수정하였다.

2.4.7. JEUS로부터 register 메시지가 한번에 다 들어오지 않을 경우 발생할 수 있는 문제

  • 많은 양의 JEUS 커넥션이 동시에 네트워크를 점유하는 등의 상황으로 인해 RegisterMsg(WJP Header + JENGINEID)를 한 번에 읽지 못하는 상태에서 발생할 수 있는 문제(예: JENGINEID가 잘려서 읽게 되는 등)를 수정하였다.

  • 관련이슈 : IMS-108399

2.4.8. filters 프로세스에서 Request header를 추가할 때 down될 수 있는 버그 수정

  • 필터에서 Request header에 특정 header를 추가할 때 클라이언트가 미리 끊는 등의 이유로 기존 Reqeust header가 없는 경우가 있을 수 있는데 이 경우를 체크하지 않은 경우 Filters 프로세스가 down될 수 있는 버그를 수정하였다.

2.4.9. JSV Response를 Compression할 때 filters 프로세스에서 처리된 결과가 반영되지 않는 문제

  • 필터에서 Set-Cookie 등을 한 경우 Compression을 처리할 때 해당 결과를 반영하지 않는 문제가 있어서 수정하였다.

2.4.10. ReverseProxy로 웹 소켓 사용할 때 FlowControl fail이 발생할 수 있는 문제

  • ReverseProxy로 웹 소켓 사용할 때 뒷단의 서버가 읽어가는 것보다 클라이언트가 보내는 것이 더 빠를 때 잠시 pending한 데이터를 다시 읽지 않는 FlowControl fail이 발생할 수 있는 문제를 수정하였다.

  • 관련이슈 : IMS-111061

2.4.11. COPY Method로 호출하여 같은 파일명 overwrite할 때 에러 발생 버그 수정

  • WebDAV 기능 중 같은 파일을 덮어쓸 때 "Overwrite: T" Request Header가 없을 경우에도 default가 T로 처리되도록 수정하였다.

  • 관련이슈 : IMS-112412

2.4.12. PROPFIND Method로 호출할 때 실패할 수 있는 문제

  • BitKinex와 같은 WebDAV 툴을 이용하여 테스트 중에 '/'로 끝나는 PROPFIND를 호출하는 경우 /index.html로 응답을 주어 'directory'가 보이지 않는 버그를 수정하였다.

  • 관련이슈 : IMS-112412