자바 웹프로젝트를 진행하여 겪는 한글인코딩 문제들 모음.

2014-02-04 01:24

현재 Spring + Mybatis 프레임워크와 Tomcat, MySql을 이용한 프로젝트를 진행하고 있습니다. 프로젝트 초창기부터 한글데이터를 기준으로 설계하였습니다. 때문에 디렉토리나 파일구조도 한글에 맞추는 방향으로 프로그래밍을 진행하였구요. 하지만 프로젝트를 진행하는 내내 한글문제가 발생합니다. 그것에 대한 리서치에도 굉장한 시간을 투자하게 되고요.

혹자는 글로벌사회에 '굳이 한글을 써야하나'..라고 할 수도 있지만 반대로 '굳이 쓰지 말아야할 이유가 있을까..?'라는 생각이 들었습니다. 만약 사용자가 모두 한국인이라고 가정한다면 한글을 사용하는편이 오히려 restful하지 않을까??라는 생각에서였지요. 그리고 지금 (첫프로젝트입니다) '한글문제를 피하게 되면 평생 프로그래밍할때마다 피하지 않을까?'라는 생각을 하니까 오기가 더욱 생긴거 같구요..

이 글을 통해서 짧은 시간동안에 제가 겪은 한글문제들을 공유해보고자 하며, 더불어 현재 맞닥트린 문제를 여쭙고자 이렇게 글을 씁니다. 저와 비슷한 문제를 겪을 사람들이 조금이나마 수고을 덜었으면 하는 바람입니다.

추가, 혹은 지적해주시는 내용들은 본문에 추가,수정하도록 하겠습니다. 제 미약한 지식에 적극적인 보탬을 부탁드립니다..

  • 아래내용 (본 프로젝트)에서는 URLEncoding을 전혀 사용하지 않았습니다.
  • 아래에 언급되지는 않지만 소스코드파일의 인코딩은 원하는 설정의 인코딩방식과 동일하게 작성되어야 합니다.

1) GET 요청시 한글 URL 오류.

예를들어 다음과같이 (localhost:8080/2013/자바지기) 요청이 있다고 가정합니다. spring controller메소드에서 @Pathvariable 로 사용하는 url value를 한글로 사용할 경우, controller메소드에서 전달받은 데이터 인코딩값이 깨지게 됩니다.

@RequestMapping("/{class1}/{professor}")
public String lecture_detail(@PathVariable String professor) {
//professor 데이터 인코딩 깨짐
}

이 문제는 tomcat 요청시 별다른 파라미터 전달이 없을경우 (header의 encoding setting 요청이 없을경우) 톰캣의 기본인코딩 설정인 8859_1형태로 인코딩되어 발생합니다. 저같은 경우에는 Spring 프로젝트의 web.xml에 encodingFilter를 UTF-8로 설정하였기 때문에 위 메소드의 파라미터로 전달받는 데이터는 8859_1인코딩 + Spring에 설정된 UTF-8인코딩 된 데이터가 전달되게 됩니다. 그러므로 정상적인 데이터를 확인하기 위해서는 아래와 같이 디코딩을 2번해야지만 정상적인 한글이 출력되게 됩니다.

URLDecoder.decode((URLDecoder.decode(param, "8859_1")), "UTF-8"); //방법1
new String(param.getBytes("8859_1"), "utf-8"); //방법2

2) 특정한글이 포함된 URL요청에서 404 not found 에러발생

1)을 통해서 한글데이터를 정상적으로 주고받을 수 있게 되었지만, 특정글자에서 URL인식이 무시되는 현상이 생깁니다. 예를들어 (localhost:8080/2013/한글) 요청에서 '한글'부분에 '종', '눅', '년' 과 같은 글자가 포함될 경우 404에러가 발생했습니다. 이 부분은 스프링이 아닌 톰캣의 URL요청상의 문제이며 요청 URL의 인코딩과정에서 일어나는 현상입니다. Tomcat의 server.xml에 설정값을 추가합니다. (리눅스의 경우 /var/lib/tomcat/conf/server.xml)

<Connector port="8080" URIEncoding="UTF-8" connectionTimeout="20000" protocol="HTTP/1.1" redirectPort="8443"/>

여기서 설정하는 URIEncoding의 설정은 1)에서 기본인코딩설정을 8859_1에서 지정하는 Charset으로 변경해줍니다. 이외에 설정할 수 있는 Tomcat옵션은 URL(http://tomcat.apache.org/tomcat-5.5-doc/config/http.html)을을) 통해서 확인할 수 있습니다.

여기서 주목할 만한 옵션을 한가지 보자면, useBodyEncodingForURI="true"로 사용하는 항목을 확인할 수 있습니다. Tomcat Encoding으로 검색할 경우 많은 포스트에서 보이는 옵션으로, HTTP Header 영역의 ContentType안에 특별히 정의된 charset이 있을경우 Tomcat에 정의된 URIEncoding 값보다 우선적용됩니다. JSP에서 자주등장하는 setCharacterEncoding을 사용하지 않더라도, 헤더에 Content-type=application/x-form-urlencoded;charset=UTF-8"으로 전송하게되면 실제로 UTF-8로 인코딩이 됩니다.

이렇게 server.xml에 설정을 추가하게되면, 이전에 사용했던 1)번의 디코딩방식을 사용하면 안됩니다. 오히려 사용하면 에러가 발생하지요.

3) DB 질의시 한글 Param에 대한 오류.

mybatis를 이용한 데이터베이스 쿼리시, 한글 Param값에 해당하는 항목들이 ??????????와 같이 처리되는것이 확인되었습니다. 데이터베이스의 charset 설정값이 UTF-8임에도 불구하고, 한글 Param값에서는 에러가 발생했습니다. 물론 쿼리가 제대로 이루어지지 않았구요. 이 문제는 Connection Pool에 인코딩설정값을 더해줌으로서 해결할 수 있었습니다. database url 선언시 하단과 같이 설정하게되면 query에 포함되는 유니코드값이 원하는 형태로 인코딩 됩니다.

String databaseURL ="jdbc:mysql://localhost:3306/dbName?useUnicode=true&characterEncoding=UTF8";

4) 리눅스 원격접속 (SSH) 한글사용하기

ssh환경에서 한글파일에 대한 테스트를 진행하고자 했는데, 기본적으로는 사용할 수 없었습니다. (타이핑해도 제자리에서 멤도는 그 현상..) 원격서버의 몇가지 설정을 변경해주고 나니 한글사용이 가능했습니다.

/etc/sysconfig/i18n

LANG="ko_KR.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"

/etc/vimrc if v:lang =~ "utf8$" || v:lang =~ "UTF-8$" set fileencodings=utf-8,euc-kr endif

/etc/bashrc

export LANG="ko_KR.UTF-8" 
export LC_ALL="ko_KR.UTF-8"

5) Mac에서 JDK 7.0을 사용할 경우, Unicode로 처리된 파일명을 읽지 못할경우

해당링크를 통해 확인할 수 있습니다 (http://www.slipp.net/questions/210))

6) Tomcat 환경에서 한글파일 생성하기. (질문드립니다.)

일반적인 자바프로젝트를 이클립스에서 작성하고, 실행하거나 Terminal에서 java컴파일 명령을 통해서 실행하거나, 두경우 모두 한글파일을 생성하는 경우에서는 별 이슈없이 원하는 CharacterSet으로 파일이나 디렉토리를 생성할 수 있었습니다. 하지만 tomcat을 이용하는 현재의 Spring 프로젝트는, 한글파일을 생성할 경우 파일제목이 글자수만큼 ?로 표기되는 현상이 일어납니다.. 예를들어 자바지기.png를 만들면 ????.png로 보이는 것이지요. 시스템설정쪽은 확인해봤지만 UTF8로 잘 되어있습니다. 톰캣프로젝트에서 실행할 경우에만 이런현상이 발견되는데... 비슷한 경험있으시다면 공유좀 부탁드리겠습니다!!!

import java.io.File;

public class KoreanTest {
	public static void main(String[] args) {
		File file1 = null;
		File file2 = new File("/Users/YOON-SUNG/Desktop/test/javajigi.png");
		
		try {
			
			file1 = new File( new String("/Users/YOON-SUNG/Desktop/test/자바지기.png".getBytes(), "UTF-8") );;



			System.out.println("file1 exists? : "+file1.exists());
			System.out.println("file2 exists? : "+file2.exists());			
			System.out.println("file1 create sucess? : "+file1.createNewFile());
			System.out.println("file2 create sucess? : "+file2.createNewFile());
			
			
			
			//file1.renameTo(new File( new String("/Users/YOON-SUNG/Desktop/test/정윤성.png".getBytes(), "UTF-8")));
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("System File Encoding : "+System.getProperty("file.encoding")); //UTF8로 잘 표기됩니다.
	}
}

위 소스는 Tomcat프로젝트와 일반프로젝트에서 동일하게 테스트되었습니다.

(2014년 2월 4일 추가)

7) Spring에서 사용하는 JSON의 인코딩문제

Spring에서 JSON, 혹은 String 데이터를 View영역으로 전달할때, Ajax통신을 하는 과정에서 @ResponseBody 예약어를 사용했습니다. 일반적으로 사용하는 MODEL 패턴을 사용할대는 객체안에 한글데이터를 담기 때문에 문제가 생기지 않지만, 브라우저를 통해 직접 데이터를 전달해주는 JSON방식에서는 한글이 깨졌습니다. 이 문제는 아래의 소스코드와 같이 produces 항목에 charset을 지정해주게 되면, 해당 인코딩방식으로 데이터를 처리해서 전달시키게 됩니다.

@RequestMapping(value="/test/SelectTreeViewData", method=RequestMethod.GET, produces="text/plain;charset=UTF-8")
	public @ResponseBody String selectTreeViewJoinData() {
		
		List<TreeViewJoinData> data = treeViewDao.selectTreeViewData();
		Gson gson = new Gson(); //구글에서 제공되는 JSON Parsing라이브러리
		String result = gson.toJson(data); //JSON형태의 스트링값으로 변환.
		
		return result;
	}

15개의 의견 from SLiPP

2014-02-04 04:01

@한석봉 님 좋은 의견 감사합니다. 덕분에 저도 한글 URL에 대해서 생각해보는 계기가 되었습니다.

저는 질문 의도와는 관련없이, 과연 한글 url이 한국인에게는 더 RESTful한 디자인인가에 대해 의견을 나누고 싶습니다.

  1. "localhost:8080/2013/자바지기"는 RESTful한가? 저는 위 URL은 RESTful하지 않다고 생각합니다. 왜냐하면 2013이 어떤 자원에 대한건지, 자바지기가 어떤 자원에 대한 건지 알기 어렵기 때문입니다. 심지어 저는 2013이 year을 뜻하는지 알았는데, class를 뜻하는 거였군요.("/{class1}/{professor}")

좀더 RESTful한 디자인이라면, "localhost:8080/classes/2013/professors/자바지기"가 되야 좋을 것 같습니다. (물론 Class가 자원이 될 수 없지만요. 이것은 논외로 하지요 ^^)

  1. "localhost:8080/classes/2013/professors/자바지기" 와 "localhost:8080/classes/2013/professors/javajigi" 중 어느것이 더 RESTful한가?

이 문제는 사실 RESTful과는 상관없는 것 같습니다. professor 자원의 상태가 '자바지기'인지 'javajigi'인지에 따라 달리되는 문제이니까요.

  1. "localhost:8080/classes/2013/professors/자바지기" 와 "localhost:8080/수업/2013/교수/자바지기" 중 어느것이 더 RESTful한가?

2번과의 차이는 2번은 '자원의 상태'가 한글이냐 영어이냐의 문제였지만, 3번은 '자원의 표현'이 한글이냐 영어이냐의 문제라는 것입니다.

놀라운건, 한글로 표현된 url이 훨씬 이해가 잘된다는 겁니다. 그렇다면 자원의 표현이 한글인게 더 RESTful한 걸 까요?

다시 생각해보니 그것도 아닌것 같습니다. 우리는 class 교수 {}가 class Professor {} 보다 잘 표현됐다고 말하지 않습니다. class 교수 {}은 불가능하니까요...

따라서 결론 짓자면 저는 한글이라고 해서 RESTful한 디자인이라고 말할 수 없다는 것입니다 :)

2014-02-04 09:38

@dongkuk 좋은 토론 꺼리네요. 이 글이 원해 자바의 한글 관련된 이슈이니 별도의 글로 빼서 토론을 해보면 어떨까요? 현재 @한석봉 님이 주신 의견과 @dongkuk 의견을 합쳐서 하나의 토론 꺼리를 만들면 재미있을 듯 하네요.

한 가지 첨언하자면 class 교수 {}는 불가능하지는 않아요? 단지, 한글 기반으로 구현하지 않을 뿐이죠? 혹시 모릅니다. 향후 프로그래머들은 한글로 구현하는 것이 소통에 더 낫다고 판단이 되면 한글로 구현할 수도 있겠죠. 어쩌면 유비쿼터스 language를 사용한다는 측면에서는 클래스명과 메서도명을 한글로 사용하는 것이 괜찮을 수도 있겠죠? 뭐 프로그래밍 세상에 정답이 있겠습니까?

2014-02-04 09:45

한글과 관련해 정말 많은 삽질을 했고, 문제를 해결했네요. 해결 과정까지 이렇게 정리해 주니 정말 좋네요.

저는 6번 질문을 다음과 같이 이해했습니다. 한글 파일을 업로드할 수 있고 이를 관리할 수 있는 방법을 찾는 것으로요. 한글 파일을 관리하는 이슈는 중요한 이슈 중의 하나입니다. 선배 개발자들의 고민한 흔적을 남겨 봅니다. 이 흔적에서 힌트를 얻어 문제를 해결할 수 있기를 기대해봅니다.

http://dazzilove.tistory.com/543 : 한글 파일을 처리하기 위한 한 개발자의 고민과 해결 과정을 볼 수 있는 문서 http://blog.naver.com/PostView.nhn?blogId=sabisung&logNo=80058854898 : UUID(이게 뭔지는 찾아보세요. GUID도 있어요.)를 활용해 해결하는 소스 코드 http://kwonnam.pe.kr/wiki/java/servlet/download : 다양한 브라우저에 따라 한글 파일을 다운로드하기 위한 처리 과정을 보여주는 소스 코드

이번 기회에 한글 파일 업로드와 다운로드에 대해 깊이 있게 파고 들어 완전한 해결책을 찾았으면 합니다. 이 과정이 모두 완료되면 앞에서 해결한 1~5번까지의 과정에 왜 그와 같은 처리가 필요한지에 대해 한번 더 파고 들면 좋겠네요. 한발 더 나아가 인코딩, 캐릭터 셋에 대해서도 이번 기회에 공부하는 기회로 가져가면 좋겠습니다. 그렇다고 제가 이를 모두 알고 있다는 뜻은 압니다. 저도 모르는 부분 많으니 추가적으로 알게 되는 내용이 있다면 공유 부탁드립니다.

2014-02-04 11:43

아.. @dongkuk님 좋은의견 고맙습니다~^^ 사실 저 부분은 예시를 위해서 저렇게 표기한것이구요~ 실제로는 말씀하신것처럼 "/2013년/1학기/휴먼디자인프로젝트/자바지기"과 같이 의미단위로 표기됩니다 ^^; class는 분류를 뜻하는것이구요;;ㅎ (대분류/소분류) 제가 생각한 RESTful이라는 의미는 다음과 같았습니다~ 우리는 한국인이기 때문에 한글로 소통합니다. 하지만 url상에 소통하는 데이터로서 의미를 부여하자면 아이디 혹은 영문으로 처리되지요. 즉, 우리가 만약 교수님 1명을 업데이트하자고 해도 영문url을 사용하면 데이터베이스 상에서 한글이외에 영문필드를 가져야하고, 영문필드를 사용하지 않는다면 "아이디값" 혹은 "순번"과 같은 숫자값을 사용하게 되지요..^^ 이런 부분들을 한글로 처리하는게 RESTful한 홈페이지의 시작이 아닐까 생각이 들었습니다 ^^

2014-02-04 12:23

@자바지기 감사합니다 자바지기님!! 좋은내용 잘 읽었습니다. ^^ 현재 파일업로드가 실시간으로 이루어지기 때문에 업로드한 시점에는 TEMP파일로 만들어서 사용하고 있는데요~ 업로드 될때마다 temp_(랜덤4자리 숫자)_(TimeStamp로 시,분,초까지)로 작성해서 중복이 발생하지 않도록 하고 있습니다.

만약 사용자가 업로드한 파일데이터와 기타 입력폼값과 함께 전송버튼을 누르게 되면, 그제서야 temp파일이 실제 해당하는 폴더로 이동하는 형태로 구현하였는데요.

1) 파일업로드 시점 - temp폴더에 위치 2) 다른 form데이터와 함께 전송버튼을 클릭 - temp폴더에서 데이터에 해당되는 위치의 폴더로 이동

즉, 제가 구현하고 했던 방식은 "2013년, 1학기, 휴먼디자인프로젝트 수업의 자바지기 교수님, 주제는 Ajax통신" 이라는 데이터를 업로드할 경우 첨부되는 파일들도 2013폴더 > 1학기 > 휴먼디자인프로젝트 > 자바지기 > 업로드파일들 [주제_수업날짜(순번)]과 같은 형태로 관리되는 것입니다. 한글 URL요청방식처럼 말이지요.

예를들어 수업자료라고 한다면 2013년 폴더 > 1학기 폴더 > 휴먼디자인프로젝트 폴더 > 자바지기 폴더 > Ajax통신_20140302(1).ppt, Ajax통신_20140302(2).ppt, Ajax통신_20140302(3).ppt 와 같은 형태로요..

즉, 저는 파일서버에 파일데이터나 디렉토리를 한글로 사용하고 싶은데, 현재까지는 방법을 찾지 못하고 있습니다..

공유주신 url에서처럼 한글을 사용하지 않고 데이터베이스와 매핑되는 고유값으로(UUID와 같은) 파일명을 정하고, 디렉토리 구조를 데이터베이스의 고유아이디값 (예를들어 2013년에 해당하는 데이터베이스 PRIMARY값 등)으로 처리한다면 간단할것 같은데요.

어떤 방향으로 초점을 맞추는것이 좋을지 조언을 부탁드립니다!

2014-02-04 12:34

@한석봉 파일을 관리할 때 사람이 인지할 수 있는 형태로 관리하지 않아도 된다고 생각합니다. 파일을 관리하는 방식은 프로그래밍을 활용해 가장 쉽고 효율적으로 처리할 수 있는 방식을 활용하는 것이 좋지 않을까요? 실제 사용자와의 인터페이스는 우리 웹 프로그래머가 만드는 웹 서비스를 통해 인터페이스가 가능하도록 해주면 되지 않을까요? 즉, 우리 웹 프로그래머가 필요한 이유겠죠.

예를 들어 다음과 같은 구조로 접근해도 되지 않을까요?

사용자 - 우리가 만든 웹 서비스 - 웹 서비스가 인식할 수 있는 파일 구조

이와 같이 사람이 인식할 수 있는 정보와 컴퓨터가 인식할 수 있는 정보를 분리해서 관리하는 방법이 있지 않을까요? 사람이 잘 인식할 수 있는 정보의 구조와 컴퓨터가 잘 인식할 수 있는 정보의 구조는 다를 수 있다고 생각합니다. 그런 관점에서 현재는 사람이 잘 인식할 수 있는 구조만 생각하고 있는데요. 다음 단계로 컴퓨터가 잘 인식할 수 있는 구조를 설계하고 이 설계에 맞춰 파일을 관리하는 방식으로 접근방식을 변경해 보는 것은 어떨까요?

2014-02-04 13:38

@자바지기 넵. 사실 곰곰히 생각해보면 제 관심사에 치중되었던것 같네요.. "컴퓨터가 잘 인식할수 있는 정보의 구조"라는 것도 인상깊구요.

하지만 이번 기회를 통해 프로그래밍에서 한글은 무조건 기피했던 제 스스로 많이 공부할 수 있었던것 같습니다. 한글에 대한 이슈는 계속적으로 업데이트해 나가도록 하겠습니다. 감사합니다 !!

2014-10-29 12:00

안녕하세요. 6번 문제로 며칠간 고민하다가... 여기까지 왔습니다. 한글 파일명 업로드에 대한 해결책이 아직 나오지 않으셨는지 궁금합니다.

저의 상황은 이렇습니다. (Tomcat5.5 + 리눅스 (euckr))

이전에는 한글로 된 파일명 업로드가 잘 이루어 지다가(2005년 ~ 현재), 이번에 이슈가 된 bash 취약점 패치 이후 6번과 같은 상황이 되었습니다.

이전 version 3.2.33(1)-release -> 현재 version 3.2.57(1)-release

패치 이후에, 파일명 뿐 아니라 서블릿에서 기록하는 개발 로그의 한글 역시 한글자에 ? <- 하나씩 나왔습니다.

System.getProperty("file.encoding") 해본 결과, US_ASCII(정확히는 기억이..) 로 나와서... jvm encoding 을 맞춰주기 위해, JAVA_OPTS 에 -Dfile.encoding=euc-kr 을 추가해 주는 것으로 해결 되었습니다.

파일명도 해결될 거라 생각했으나, 파일명은 여전히 ? <- 로 표시됩니다... ...

혹시 6번 항이 해결 되셨다면... 혹은 힌트가 될 수 있는 부분이 있다면... 공유해 주시면 감사하겠습니다..!!!

2014-10-29 12:47

@CICADA 이 정보만으로는 문제를 해결하기 힘들 듯 하네요. 다음 내용 확인해 주시면 약간의 도움이 될 수도 있겠네요.

  • apache + tomcat과 연결해 사용한다면 web server와 tomcat 연결할 때 connector 설정 인코딩은 되어 있는가?
  • 한글 파일명 이외에 다른 입력 폼에서 한글 입력을 할 때는 문제가 없나요? web.xml에 한글 인코딩을 위한 필터가 설정되어 있는가?
  • 시스템에서 한글 파일명이 깨지는가? 데이터베이스에 입력되는 한글 파일명도 깨지는가?

현재 시스템 환경 설정이 US_ASCII로 되어 있다고 하는데요. 일단 시스템 환경 설정부터 euc-kr로 변경하고 시작하는 것이 가장 깔끔할 듯 합니다. 그 이후에 하나씩 해결해 가는 것으로다.

2014-10-29 14:33

@자바지기

안녕하세요, 도움주셔서 감사합니다.

  1. apache + tomcat 연결할 때 : apache 인코딩은 euckr 상태이구요, 테스트 서버에서는 현재 톰캣으로 직접 접근중입니다. http://------:8080/login.jsp

  2. 8년 정도 운영중인 사이트 이며, 웹 및 서블릿 쪽 한글 인코딩 설정은 모두 euckr 로 맞춰져 있습니다. 인코딩 필터 역시 되어 있고, 다른 입력 폼에서의 한글 문제는 현재 없습니다. 다만, 이번 bash 취약점 패치 이후에 파일 업로드 시, 저장되는 파일 명이 6번 항목과 같이 저장됩니다.
  3. 시스템에서 한글 파일명이 깨집니다. 데이터베이스는 SQL Server 2005 사용중이며, 파일명 입력시 제대로 들어갑니다.

그리고 현재 시스템 환경 설정이 US_Ascii 인 것이 아니고, 위에 제가 잘못 적었네요....

시스템 환경 설정은 LANG=ko_KR.eucKR 입니다.

bash 패치 이후에, 서블릿 코드에 Charset.defaultCharset().name() 돌려보았을때 us_ascii 로 나타났습니다. (현재 톰캣 구동중인 jvm 인코딩)

그 부분을 맞춰주니(JAVA_OPTS 에 -Dfile.encoding=euc-kr), bash 취약점 패치 이후 시스템 로그에서 한글이 ??? 로 나타나던 현상이, bash 패치 이전과 같이 시스템 로그에 한글이 제대로 들어갑니다.

하지만 여전히 파일명은 ??? 로 남고 있구요...

2014-10-29 17:49

@CICADA 제가 판단했을 때 필요한 설정은 모두 한 듯 한데요. 데이터베이스에 파일명이 정상적으로 입력된다면 JVM에서 파일을 쓰는 시점에 인코딩이 깨진다는 의미네요.

일단 간단한 자바 프로그램 만들어서 파일 생성시 한글이 정상적으로 동작하는지 실행 보면서 단계적으로 접근하는 것이 해결책에 도움이 될 듯 하네요.

자바 소스 코드를 컴파일하는 시점의 인코딩도 살펴보시면 좋겠네요. http://mcpaint.tistory.com/88 문서도 참고해 보시고요.

2014-10-29 20:23

@자바지기 간단한 자바 프로그램을 만들어서 파일 생성 -> 한글 파일 제대로 나옵니다... 오랜 고민 끝에 해결 되었습니다. 함께 고민해주신 자바지기님 감사합니다.^^

위 글에서의 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 인코딩 설정을 해주는 것으로 알고있습니다.

  1. 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"

제대로 나옵니다. 파일 업로드 시 한글 이름이 어여쁘게 들어갑니다. ㅠ_ㅠ 아마도... 오래된 시스템 + 리눅스 구버전 + 톰캣 구버전 이 합쳐서 만들어진 상황이었던 듯 합니다.

저와 같은 상황이신 분들에게 도움이 되었으면 하는 바람에 의견을 남겨둡니다.

2014-10-30 10:07

@CICADA 오호. 힘든 과정을 통해 해결되었다니 다행입니다. shell을 통해 프로그램을 실행하는 경우 shell을 실행하는 사용자가 달라져 시스템 환경을 그대로 읽어오지 못하는 경우는 종종 발생합니다.

저는 이런 상황을 방지하기 위해 shell에 추가적인 설정을 하기도 합니다. 힘든 과정이었지만 좋은 경험이었다고 생각하네요.

다른 분들을 위해 길게 댓글 남겨주셔서 감사합니다. 같은 문제로 고생하는 분들에게 많은 도움 될겁니다.

2014-11-10 19:04

좀 외적인 질문인데 서버 관련해서 궁금한게 있습니다.

지금 소규모의 소프트웨어를 개발하였고 이를 인터넷에서 서비스 하기 위해 노력중인데

네트워크 쪽으로 아는게 없고 인터넷에 찾아도 나오지 않아 너무 힘드네요.

ibm3880m4라는 서버를 구매하여 고정 ip를 설정하고 DNS까지 설정해 놓은 상태입니다.

톰캣7.0을 설치해서 서버를 돌리고 있는 상태이고 다른 컴퓨터에서 서버 ip를 쳤을때 링크가 깨졌다고 나옵니다.

페이지가 없다고 나오는게 아니라 저렇게 나오는걸 보면 아무래도 연결은 되어있는것 같은데 첫 jsp 페이지가

나오질 않네요

첫 jsp 페이지를 나오게 하고 싶은데 방법 없을까요?

의견 추가하기

연관태그

← 목록으로