한글기안기 사용중 400 에러가 발생하는 현상 관련 문의드립니다.

안녕하세요

공공결재 그룹웨어 고객사를 유지보수하면서 한글 웹기안기의 기술지원이 필요하여 문의드립니다.

고객사 서버 구성은 아파치 / 톰캣 서버로 구성되어있습니다.

한글 기안기 사용 도중(상신, 안추가, 임시저장등) 간헐적으로(10~20회 반복시 한두번 발생함) 웹한글기안기의 응답 오류로 발생하고 있습니다.

오류발생시 브라우저 로그 및 웹서버(아파치)의 액세스 로그 상으로는 400 오류가 전달되며

웹한글 기안기의 액세스 로그(톰캣)를 확인해보면 아래와 같이 500에러가 발생합니다.
/gwstore/weditor/tomcat/logs/localhost_access_log.2023-12-20.txt
0:0:0:0:0:0:0:1 - - [20/Dec/2023:14:52:57 +0900] “POST /webhwpctrl/save HTTP/1.1” 500 685

웹 한글기안기 톰캣의 catalina.out 로그상으로는 EOF가 출력 됩니다.
/gwstore/weditor/tomcat/logs/catalina.out

org.apache.catalina.connector.ClientAbortException: java.io.EOFException: 소켓에서 예기치 않은 EOF를 읽었습니다.
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:340)
at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:632)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:362)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:110)
at com.hancom.webhwp.control.Requester.forwardRequest(Requester.java:54)
at com.hancom.webhwp.control.FilterRequester.doPost(FilterRequester.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at filters.CORSFilter.doFilter(CORSFilter.java:29)

– 의심되는 로그 내용을 추가로 전달해드립니다.

14:52:57 에 발생한 오류 관련 로그
액세스 로그상으로 보면 500에러가 발생함
파일명
/gwstore/weditor/tomcat/logs/localhost_access_log.2023-12-20.txt
로그내용
127.0.0.1 - - [20/Dec/2023:14:52:57 +0900] “POST /filterserver/save HTTP/1.1” 200 162
0:0:0:0:0:0:0:1 - - [20/Dec/2023:14:52:57 +0900] “POST /webhwpctrl/save HTTP/1.1” 200 151
127.0.0.1 - - [20/Dec/2023:14:52:57 +0900] “GET /filterserver/get/dfef7382-9565-4bf0-8489-f9bc8e70dd90/048044a4-897b-4079-a067-e7c4d262d545.hwpml2x HTTP/1.1” 200 67202
0:0:0:0:0:0:0:1 - - [20/Dec/2023:14:52:57 +0900] “GET /webhwpctrl/get/dfef7382-9565-4bf0-8489-f9bc8e70dd90/048044a4-897b-4079-a067-e7c4d262d545.hwpml2x HTTP/1.1” 200 67278
0:0:0:0:0:0:0:1 - - [20/Dec/2023:14:52:57 +0900] “POST /webhwpctrl/save HTTP/1.1” 500 685

로그내용상으로는 특별한점이 없음
파일명
/gwstore/weditor/tomcat/logs/filterserver.out
로그 내용
Line 10049: [2023-12-20 14:52:57] INFO (AbsHwpCommandConnect.java:36) executeResult result: 0
Line 10050: [2023-12-20 14:52:57] INFO (SaveController.java:240) saveFile [ADMIN_LOG][SAVE] : (true) From : hwpj.data , To[HWPML2X] : 048044a4-897b-4079-a067-e7c4d262d545.hwpml2x

/gwstore/weditor/webhwpctrl/webhwp-filter-service/logs/filter-service.log
INFO ?:? [2023-12-20 14:52:57,168] - Method: saveAs
Params: {inputFilePath:/gwstore/weditor/data/upload/dfef7382-9565-4bf0-8489-f9bc8e70dd90/hwpj.data, outputDirPath:/gwstore/weditor/data/save/dfef7382-9565-4bf0-8489-f9bc8e70dd90, documentName:048044a4-897b-4079-a067-e7c4d262d545.hwpml2x, format:HWPML2X, arg:code:unicode;lock:false;, binDataPath:/gwstore/weditor/data/upload/dfef7382-9565-4bf0-8489-f9bc8e70dd90/save/images/, password:com.hancom.hwp.service.socket.command.NullValueClassContainer@5f7b4f6e, }
INFO ?:? [2023-12-20 14:52:57,168] - HwpFilterCommandImplement.saveAs(/gwstore/weditor/data/upload/dfef7382-9565-4bf0-8489-f9bc8e70dd90/hwpj.data, /gwstore/weditor/data/save/dfef7382-9565-4bf0-8489-f9bc8e70dd90, 048044a4-897b-4079-a067-e7c4d262d545.hwpml2x, HWPML2X, code:unicode;lock:false;, /gwstore/weditor/data/upload/dfef7382-9565-4bf0-8489-f9bc8e70dd90/save/images/, null)
INFO ?:? [2023-12-20 14:52:57,177] - executeHwpCommands: Return Value: 0, ExecuteTime: 9, Type: java.lang.Integer, Command: Method: saveAs
Params: {inputFilePath:/gwstore/weditor/data/upload/dfef7382-9565-4bf0-8489-f9bc8e70dd90/hwpj.data, outputDirPath:/gwstore/weditor/data/save/dfef7382-9565-4bf0-8489-f9bc8e70dd90, documentName:048044a4-897b-4079-a067-e7c4d262d545.hwpml2x, format:HWPML2X, arg:code:unicode;lock:false;, binDataPath:/gwstore/weditor/data/upload/dfef7382-9565-4bf0-8489-f9bc8e70dd90/save/images/, password:com.hancom.hwp.service.socket.command.NullValueClassContainer@5f7b4f6e, }

/gwstore/weditor/tomcat/logs/catalina.out
org.apache.catalina.connector.ClientAbortException: java.io.EOFException: 소켓에서 예기치 않은 EOF를 읽었습니다.
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:340)
at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:632)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:362)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:110)
at com.hancom.webhwp.control.Requester.forwardRequest(Requester.java:54)
at com.hancom.webhwp.control.FilterRequester.doPost(FilterRequester.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at filters.CORSFilter.doFilter(CORSFilter.java:29)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.EOFException: 소켓에서 예기치 않은 EOF를 읽었습니다.
at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:788)
at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42)
at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1133)
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:102)
at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:249)
at org.apache.coyote.Request.doRead(Request.java:551)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:336)
… 36 more
org.apache.catalina.connector.ClientAbortException: java.io.EOFException: 소켓에서 예기치 않은 EOF를 읽었습니다.
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:340)
at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:632)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:362)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:110)
at com.hancom.webhwp.control.Requester.forwardRequest(Requester.java:54)
at com.hancom.webhwp.control.FilterRequester.doPost(FilterRequester.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at filters.CORSFilter.doFilter(CORSFilter.java:29)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.EOFException: 소켓에서 예기치 않은 EOF를 읽었습니다.
at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:788)
at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42)
at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1133)
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:102)
at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:249)
at org.apache.coyote.Request.doRead(Request.java:551)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:336)
… 36 more

그룹웨어의 로직 문제보다는 한글 웹기안기의 문제로 예상되는데 원인 파악이 되지 않아 도움 요청드립니다.
해당 현상을 해결할 수 있는지 조언 부탁드립니다.

감사합니다.

안녕하세요. 한컴디벨로퍼입니다.

현재 담당자가 내용을 확인하고 있습니다. 조금만 기다려 주세요.

한컴디벨로퍼를 이용해 주셔서 감사합니다.

안녕하세요.

ClientAbortException 이 발생한것으로 보아서
최초 save 요청이 전달되고 이에대한 응답을 받기 전에 client 요청이 중단되던가, 동일한 요청이 중복 전달되었을 가능성이 있을것 같습니다.

save 시 전달되는 데이터 양이 많아서 timeout 이 발생할수도 있을것 같고,
client 로직상 요청에 대한 처리가 완료되기 전에 페이지가 갱신되는 등 해당 요청이 중단되는 상황이 발생되었을 가능성이 있을것 같습니다.

위와 같은 현상이 일어날 가능성이 있을지 client 코드 검토 부탁드립니다.

감사합니다.