Entries for month: 10월 2013

Railo Server 관리자로 로그인시 Add the "-javaagent" JVM argument and set it to point to the railo-inst.jar 와 같은 메시지가 나타난다면, /opt/railo/tomcat/bin/setenv.sh 파일을 다음과 같이

-javaagent:${CATALINA_HOME}/../lib/railo-inst.jar

구문을 추가해 줍니다. 이와 관련한 Railo blog의 내용은 다음을 참조해 주세요. (http://blog.getrailo.com/post.cfm/railo-4-1-smarter-template-compilation)

JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=64m -javaagent:${CATALINA_HOME}/../lib/railo-inst.jar";  

FTP(VSFTPD)를 설치 후 외부에서는 접속이 잘 되는데 사내에서는 안되는 이유가 뭘까?

결론부터 이야기하자면 FTP의 Active모드와 Passive의 특성 때문이다.

FTP는 일반적으로 20번과 21번으로 데이터의 전송과 접속을 한다. 따라서 FTP서버(vsftpd와 같은)를 설치한 후 설치한 서버의 방화벽에서 20번과 21번은 당연히 오픈해야 한다. 그런데, 사내의 방화벽외부의 타사에서 접속하는 경우에는 잘 되는 접속이 유독 사내에서 안되는 경우가 있다. (엄밀히 말하면 접속은 되는데 디렉토리 목록을 받아오지 못하고 데이터를 송수신을 못하는 경우) 이는 FTP서버와 접속을 Active모드로 했기 때문이다.

FTP의 Active 모드는 접속은 클라이언트가 하지만 데이터전송을 위한 접속은 "서버가 클라이언트"에게 요청한다. 대충 말로 쓰자면 이런 시나리오다.

외부의 A가 우리 사내의 FTP서버에 접속을 하면 우리 사내 FTP서버는 외부A에게 데이터를 전송할 포트를 알려달라고 요청하게 된다. 이때 외부A의 1024이상의 포트로 접속이 이루어지고 데이터를 송수신할 수 있게 된다. 대개 외부A는 일반 가정 또는 단순히 인터넷에 접속된 PC라면 큰 문제는 없겠지만 외부A가 속한 네트워크에서 방화벽이 가동중이라면 당연 20, 21번(또는 1024번 이상)을 오픈해야 한다.

문제는 이렇게 외부A의 방화벽 관리자는 센스가 철철 넘쳐서 설정해 주었는데 우리사내 FTP의 관리자는 단순히 서버자신의 20, 21번을 오픈해놓고 일다했다고 하면 곤란해 진다. 이유는 Active모드에서는 사내에서 접속하는 모든 클라이언트의 20,21번(또는 1024번 이상)을 오픈해 주어야 하니까. 즉, 우리 사내의 B가 사내 FTP서버에 접속을 시도하면 대개 아웃바운드는 허용이니까 접속은 된다. 그러나 Active모드의 특성상 FTP서버가 사내B에게 접속할 포트를 알려달라고 하면 B는 묵묵부답인 상태가 될 것이다. 왜냐하면 B의 송수신을 관장하는 방화벽에서는 20, 21번(또는 1024번 이상)을 오픈한 적이 없으므로.

고로 Active모드로 사내 FTP서버를 구성하고 사내에서 접속을 허용하고 데이터를 송수신하려면 FTP서버 자신뿐만 아니라 접속하는 모든 개개PC의 20, 21번(또는 1024번 이상)도 오픈해 주어야 한다. 그러나 사내 네트워크가 방대하고 보안상 직원PC의 포트를 오픈할 수 없는 경우 등 사유가 발생하면 FTP서버를 Passive모드로 설정해야 한다.

Passive모드는 "클라이언트가 서버"에게 데이터전송을 위한 포트를 요청한다. 다만 Passive모드는 데이터전송을 위한 20번을 사용하지 않으므로 1024포트 이상의 특정 포트를 사용하므로 해당 포트를 오픈해야 한다. (관리자가 임의 지정할 수 있으며 대부분의 vsftpd 등에서 이를 지원한다. ) 물론 FTP서버에서 오픈해야하는 포트수가 늘어나는 단점이 있고, 다른 서비스에서 사용중인 포트를 확인하여 충돌나지 않도록 해야 한다.

참조 : http://mintnlatte.tistory.com/407 

CFFTP태그는 손쉽게 ColdFusion 문서에서 외부의 FTP서버에 연결해서 해당 내용을 가져오거나 파일을 업로드하거나, 다운로드할 수 있는 아주 유용한 태그입니다. 마치 ColdFusion웹문서가 FTP클라이언트처럼 작동하게 해주는 강력한 기능을 제공합니다. 사용방법도 너무 쉬워서 몇줄의 코드로 간단하게 구현할 수 있습니다.

그런데 ASP와 같은 Windows계열의 웹개발언어에서는 CP949와 같은 운영체제의 인코딩과 EUC-KR과 같은 웹페이지 인코딩으로 기본적으로 한글을 사용하기에 매우 편리합니다만, 웹개발시 한글과 영문외의 문자 가령, 일본어 등과 같은 경우엔 별도의 조치를 취해주어야 합니다.

반면 대부분의 Linux환경에서는 UTF-8을 기본 지원하고 있어서 특별히 문자열에 대한 고민을 할 필요는 없습니다만, JVM에 기반한 웹언어를 사용시에는 유니코드를 사용할때 추가적인 조치를 해줘야 합니다.

사실 Windows나, Linux나 ASP나 PHP나 또는 JSP, ColdFusion과 같은 대부분의 것들이 영어권국가(미국)에서 만들어지고 개발되어진 탓에 그들의 언어에 태생적으로 얽여있다는 이유 등으로 그들은 특별한 조치없이 기본적으로 지원되는 ISO-8859-1과 같은 인코딩을 이용하여 편리하게 이용하는 반면, 한글과 같은 2Byte 문자권에서는 늘 무언가의 조치를 해줘야 하는 불편함이 있기는 매 한가지 입니다.

최근에 Ubuntu Linux에 구축된 외부의 VSFTP서버에서 디렉토리와 파일목록을 가져와야 하는 작업을해야 할 상황이 생겼습니다. 기본적으로 Ubuntu는 UTF-8환경이고, FTP의 디렉토리 및 파일명 역시 UTF-8 형식으로 만들어지고 저장된 파일이여서 큰 걱정을 안했는데 역시 불길한 예감은 틀린적이 없었습니다.

한글로 된 모든 디렉토리명 및 파일명이 깨져서 반환되는 것이었습니다. 실행되는 ColdFusion문서를 UTF-8로 처리하도록 해보았지만 역시나 동일한 결과. 그리하여 생각해낸게 Java로 아예 파일 및 디렉토리명의 문자열이 무슨 인코딩인지 알아보기로 했습니다. 

간단하게, 구글링을 통하여 Detecting Character Encoding In Coldfusion 글을 참고하여 테스트한 결과 Latin1 즉, ISO-8859-1인코딩으로 디렉토리명과 파일명이 반환됨을 알게되었죠. 아래 그림을 참고하시면 이해가 빠르실 겁니다.

Fixing broken character encoding for CFFTP

그림에서와 같이 어떤 FTP서버내에는 vod라는 디렉토리가 있는데 그 하위에 "스페셜"이란 한글로 명명된 디렉토리가 있습니다. 그리고 그 안에는 2개의 mp4파일이 존재하는데 각각 한자와 한글로 된 파일명을 가지고 있습니다.

일반적으로 CFFTP태그로 덤프(위 그림의 보라색 표 부분)를 해보거나 단순히 path와 같은 속성값을 출력해 보면 위 그림의 윗 부분처럼 한글(한자)로 된 부분이 깨져버립니다. 실행되는 ColdFusion문서자체가 UTF-8로 저장되고, 실행되고, 원격지의 FTP서버가 UTF-8로 운영되어도 말이죠. 아마도 추측컨데 JVM의 문제일듯합니다. 문자셋 문제는 대부분.

자, 그럼 위 그림의 UTF-8부분처럼 정상적으로 디렉토리명과 파일명을 가져오려면 어떻게 해야 할까요? 바로 파일을 가져올 디렉토리명의 한글을 ISO-8859-1로 그리고 반환되는 파일명을 UTF-8로 동적으로 변환해서 처리하면 됩니다. 

<cfprocessingdirective pageencoding="utf-8">
<cfcontent type="text/html; charset=utf-8">

<!--- ISO-8859-1(Latin1)을 UTF-8로 --->
<cffunction name="convertToUTF8" access="private" returntype="string" output="false">
    <cfargument name="txtString" type="string" required="true" />
	<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("ISO-8859-1").newEncoder() />
	<cfif encoder.canEncode(txtString)>
        <cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('ISO-8859-1'),'UTF-8').tostring()>
	</cfif>	
	<cfreturn #convertedTxt# />
</cffunction>

<!--- UTF-8을 ISO-8859-1(Latin1)로 --->
<cffunction name="convertToLatin1" access="private" returntype="string" output="false">
    <cfargument name="txtString" type="string" required="true" />
	<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("UTF-8").newEncoder() />
	<cfif encoder.canEncode(txtString)>
        <cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('UTF-8'),'ISO-8859-1').tostring()>
	</cfif>	
	<cfreturn #convertedTxt# />
</cffunction>

<!---FTP연결 시작--->
<cfftp action="open" connection="ftpQuery" username="demouser" password="demopasswd" server="someserver" stopOnError="yes"> 

<!--- 
FTP디렉토리에 한글이 있는 경우 해당 디렉토리를 불러오려면 convertToLatin1 함수를
해당 디렉토리 및 파일명이 한글인 경우 깨지는 것을 막기위해 convertToUTF8 함수를
--->

<!--- 디렉토리 및 파일리스팅 --->
<cfftp action="listdir" stopOnError="yes" name="getDirFiles" directory="#convertToLatin1('/vod/스페셜/')#" connection="ftpQuery">

<cfoutput query="getDirFiles">
	#convertToUTF8(path)# <br />
</cfoutput>

<hr />
<cfdump var="#getDirFiles#">

<!--- FTP연결 삭제 --->
<cfftp action="close" connection="ftpQuery" stopOnError="Yes"> 

위의 코드를 보죠. 위의 코드는 어떤 FTP에 연결과 "/vod/스페셜"이라는 디렉토리에서 파일들의 목록을 가져오는 코드입니다. 먼저 "/vod/스페셜"이라는 한글이 포함된 디렉토리명은 ISO-8859-1로 변환해서 ColdFusion서버에게 전달하고, ColdFusion서버에서 해당 FTP의 파일목록을 반환할때는 UTF-8로 반환되도록 함수를 2개 만들었습니다. 각각, convertToUTF8과 convertToLatin1라는 사용자정의함수(UDF : User Defined Function)입니다.

중간의 코드중에 directory="#convertToLatin1('/vod/스페셜/')#" 부분과 #convertToUTF8(path)# 부분에 각각 해당 함수가 쓰여 자동으로 문자열의 인코딩을 변경합니다. 

대부분 CdolFusion에서 로컬서버 및 원격서버와의 파일송수신, 파일목록의 반환, 압축(CFZIP) 등의 작업을 처리할때 한글파일명과 디렉토리명이 늘 깨져 말썽인데요. 이 함수를 적당히 응용하면 대부분의 문제는 해결되리라 봅니다. 

중요한 것은 ColdFusion서버가 Windows에서 구동되는 경우에는 이러한 문제가 거의 없다는 겁니다.(Windows가 좋다기보다 워낙 Windows는 모든 시스템의 문자셋을 해당 현지언어로 셋팅해버리기 때문에) 이 경우는 대부분 Linux에서 설치된 ColdFusion서버에서 발생하는 상황입니다. 혹시나  Linux나 Mac, Solaris와 같은 운영체제에서 ColdFusion을 구동하는 경우 한글처리에 도움되시길 바라는 마음에서 몇자 남깁니다. (물론, 중국어나 일본어도 동일하게 사용할 수 있겠죠?) 

 

Powered by

© 2010-2018 NOOREE.COM