티스토리 뷰
http://slipp.net/questions/254 에 댓글로 남긴 내용이다.
이번 계기로 리눅스 상에서 WAS 구동에 대해 더 이해가 깊어진 듯...
6. 한글파일을 생성할 경우 파일제목이 글자수만큼 ?로 표기되는 현상이 일어납니다..
간단한 자바 프로그램을 만들어서 파일 생성 -> 한글 파일 제대로 나옵니다...
오랜 고민 끝에 해결 되었습니다. 함께 고민해주신 자바지기님 감사합니다.^^
문제의 시작 : 기존 운영중이던 사이트가, bash 취약점 패치 이후 갑자기 위 글의 '6'번 과 같은 상황이 되었습니다.
bash 취약점 참고 : http://www.ahnlab.com/kr/site/securitycenter/asec/asecView.do?webNewsInfoUnionVo.seq=22903&groupCode=VNI002
??as????.xls <- 파일명이 다음과 같이, 한글 한글자 당 물음표 하나씩으로 나옵니다.
추측으로는,
파일 업로드 시에 톰캣 -> 리눅스 bash shell 접근.
bash shell 로 넘어오는 데이터 중에, 공격의 위험이 있는 부분을 막고, bash shell 에서 인식하는 듯 합니다.
해결 방법 (UTF-8 일 경우 euc-kr 란에 UTF-8 입력)
웹과 소스 파일 자체의 인코딩 문제는 없다는 가정 하에....
1. tomcat 구동 스크립트에 JAVA_OPTS 부분에 "-Dfile.encoding=euc-kr" 추가.
예시
원문 : JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.log...
수정 : JAVA_OPTS="$JAVA_OPTS "-Dfile.encoding=euc-kr" "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.log...
bash 패치 이전에는 위와같이 Dfile... 부분이 없었음에도 Charset.defaultCharset().name() 날려보면 결과값이 EUC-KR 로 나왔습니다. 하지만 bash 패치 이후로는 US_Ascii (정확한 표현명칭은 가물가물 합니다만...) 로 결과값이 나왔습니다.
Dfile.... 추가 후에는 결과값이 EUC-KR 로 나옵니다.
제가 알기로는 Dfile 부분이 jvm 인코딩 설정을 해주는 것으로 알고있습니다.
2. tomcat 구동 스트립트에 export LANG="ko_KR.eucKR" 추가. <<<<< 이것이 포인트 였습니다.
/etc/sysconfig/i18n 에 분명 위에 해당하는 부분이 있습니다. 그 외에, 필요한 부분에 다 있습니다. 다!
쉘에서 확인 해 보면...
#locale
LANG=ko_KR.eucKR
LC_CTYPE="ko_KR.eucKR"
LC_NUMERIC="ko_KR.eucKR"
LC_TIME="ko_KR.eucKR"
.
.
#su tomcat
$locale
LANG=ko_KR.eucKR
LC_CTYPE="ko_KR.eucKR"
LC_NUMERIC="ko_KR.eucKR"
LC_TIME="ko_KR.eucKR"
.
.
위와 같이 제대로 나옵니다.
하지만 bash 취약점 패치 이후로...
서블릿 안에서 Runtime 을 이용해 runtime.exec("locale"); 를 날려 확인해 본 결과
두둥...
runtime locale exec : LANG=
runtime locale exec : LC_CTYPE="POSIX"
runtime locale exec : LC_NUMERIC="POSIX"
runtime locale exec : LC_TIME="POSIX"
runtime locale exec : LC_COLLATE="POSIX"
.
.
위와 같이 POSIX(시스템 디폴트?) 로 되어있더군요.
톰캣에서 서버에 파일을 업로드 할 때 bash shell 에 접근하는데, bash shell 접근 방식에 따라서, bash 에서 모든 값을 제대로 넘겨받는것이 아닌 듯 싶습니다. (아마도 보안 취약점으로 인하여 막는 듯 합니다.)
tomcat 구동 스크립트에 export LANG="ko_KR.eucKR" 을 추가한 이후에...
runtime locale exec : LANG=ko_KR.eucKR
runtime locale exec : LC_CTYPE="ko_KR.eucKR"
runtime locale exec : LC_NUMERIC="ko_KR.eucKR"
runtime locale exec : LC_TIME="ko_KR.eucKR"
제대로 나옵니다. 파일 업로드 시 한글 이름이 어여쁘게 들어갑니다. ㅠ_ㅠ
아마도... 오래된 시스템 + 리눅스 구버전 + 톰캣 구버전 이 합쳐서 만들어진 상황이었던 듯 합니다.
저와 같은 상황이신 분들에게 도움이 되었으면 하는 바람에 의견을 남겨둡니다.
'개발' 카테고리의 다른 글
react-hook-form with multiple inputs (0) | 2024.05.08 |
---|---|
맥 에서 파일 / 디렉토리 (폴더) 구조 텍스트로 가져오기 (0) | 2017.08.17 |
맥 에서 이클립스 실행 후 무한 로딩 상태로 멈춰있을때... (0) | 2016.07.07 |
CentOS7 에서 YUM 으로 MySQL 5.7 설치 시.. (0) | 2016.06.14 |