2010년 2월 4일 목요일

Signed Applet

웹기반 시스템에서 사용자의 로컬 자원에 접근하기 위해서는 보통 ActiveX를 많이 사용하십니다.
그러나 이미 아시다시피 ActiveX는 웹표준기술이 아닙니다.  한 때 우리나라에서는 ActiveX가 마치
무슨 엄청난 고급기술인양 모든 사이트에 적용했던 시절이 있었다고 하는데, 현재는 MS에서도
더이상 ActiveX를 지원하지 않기로 하는 등의 이유로 새로 개발되는 웹시스템에서는 점차 사라지는
경향입니다.  무엇보다 ActiveX 기술이 적용된 사이트는 IE로 접근하지 않고서는 작업자체가 어렵습
니다.

 최근에 새로운 프로젝트를 맡게되었는데, 웹에서 장비 인터페이스를 구성해야 하는 일입니다.
어떠한 기술을 사용할까 하고 습자지처럼 얇은 지식을 이리저리 굴려보았는데, 생각나는건 ActiveX
뿐이더군요.  AIR를 사용할까도 생각해봤지만 AIR는 웹환경도 아니고, 결정적으로 장비인터페이스를
위한 Serial통신을 지원하지 않습니다(방법이 아주 없지는 않습니다. 별도의 어플을 타고 COM포트에 접근하는 방법이 있더군요.).  그래서 고민 끝에 선배의 조언을 듣고 선택한 것이 Signed Applet입니다.

Signed Applet

 그러나 기존의 애플릿은 로컬자원에 접근이 불가합니다.  초기의 JAVA1.1버전에서는 가능했다고도
하는데, 보안상의 이유로 JAVA의 버전업과 함께 제한을 둔 것 같습니다.  때문에 그 대안으로 나온게
바로 Signed Applet입니다.  개발자가 애플릿 클래스가 포함된 jar파일에 인증을 하고, 인증된 애플릿
을 웹페이지에 임베드합니다.  그러면 사용자는 해당 애플릿이 임베드된 페이지에 접근을 할 때, 보안상의 이유로 제한된 애플릿의 기능을 해제해 줄 것인지의 여부를 선택할 수 있습니다. 



파이어폭스에서 Signed Applet이 임베드된 페이지에 접속한 화면입니다. 
사진에서와 같이 사용자에게 애플릿의 사용여부를 묻고, 사용자가 취소를 선택하면 그냥 일반
애플릿과 같이 취급됩니다.  우측 하단의 [자세한 내용...]을 선택하시면 더 자세한 내용(당연히)을
확인하실 수 있습니다.  자세한 내용이란, 해당 Signed Applet에 대한 내용으로 인증기간정보도
포함됩니다.


Signed Applet 생성 방법

Signed Applet을 만들기 위해서는 우선 애플릿을 작성하셔야 합니다.
애플릿을 작성하셨다면 작성한 애플릿의 class파일을 jar 파일로 압축하셔야 합니다.

  jar cvf TestApplet.jar TestApplet.class


위와 같이 jar파일을 만드셨다면 keytool 이라는 유틸을 사용하여 key pair 라는 걸 생성합니다.
이 작업을 통해 public/private 키를 생성한다고 하는데요.  의미를 보면 애플릿 작성자의 PC에
private 키를 생성하고 배포될 jar파일에 public 키를 생성하여 개발자와 애플릿을 인증하는 절차
입니다.

참고로 keytool이라는 유틸은 JDK가 설치된 디렉토리의 bin 폴더 안에 위치합니다.

  keytool -genkey -dname "cn=Lee JS, ou=SWFac, o=SWFac, c=KR" -alias TestApplet
  -keypass 123456 -storepass 123456 -validity 365


이제 jar 파일이 위치한 곳으로 이동하셔서 위의 명령어를 한 줄에 모두 입력하시면 됩니다.
물론 keytool이 위치한 폴더가 path로 잡혀있어야 하겠죠. 
위의 명령어를 보시면 cn, ou, o, c 라는 큰 따옴표 안의 속성이 있는데, 모두 임의로 변경해도 되는
값입니다.  cn은 개발자명, ou, o는 회사명이나 지역명, c는 국가명인듯합니다.
위 명령어를 입력하시면 내문서 폴더에 .keystore라는 파일이 생깁니다.  이 파일 내에 -alias 다음
에 입력한 애플릿명으로 키값이 생성됩니다.  애플릿명이라고는 하지만 사실은 별명 같은 값이고 다음 단계에서 필요한 값이므로 임의의 값을 입력하셔도 됩니다.  그러나 같은 별명을 두 번 사용하실 수는 없습니다.
-keypass와 -storepass 값은 다음 단계인 jarsigner를 사용하여 사인을 하는 단계에서 필요한 패스
워드입니다.
마지막으로 -validity는 이 인증이 유효한 기간을 날짜로 입력합니다.  위의 예에서는 365일, 즉 1년
간 유효한 인증이 되겠네요.

다음 단계는 jar 파일에 sign을 남기는 단계입니다.

  jarsigner -storepass 123456 -keypass 123456 TestApplet.jar TestApplet


jarsigner 유틸 또한 JDK가 설치된 폴더의 bin 폴더 내에 위치합니다.
위의 명령어를 한 줄로 입력하면 사인이 완료됩니다.  입력되는 값은 keytool를 사용하여 키값을
생성할 때 사용한 값입니다. 

이 과정을 모두 거치면 Signed Applet이 완성됩니다.
아래와 같이 간단한 html파일을 만들어서 확인해 보세요.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
Test Test Test

 <APPLET name="pConn" width="0" height="0">
  <PARAM NAME = ARCHIVE     VALUE = "SerialPortConn.jar, comm.jar" />
  <PARAM NAME = CODE        VALUE = "SerialPortConn.class" />
  <PARAM NAME = CODEBASE    VALUE = "." />
 </APPLET>
</body>
</html>


혹시라도 내용이 부족하거나 틀린 부분이 있다면 알려주세요...

참고사이트:
http://www.developer.com/java/ent/article.php/3303561/Creating-a-Trusted-Applet-with-Local-File-System-Access-Rights.htm

http://www.redwiki.net/wiki/wiki.php/java/java2%20signed%20applet%20%C1%A6%C0%DB%20%C6%A9%C5%E4%B8%AE%BE%F3



http://www.dude.co.rk

P 이경철님의 파란블로그에서 발행된 글입니다.

댓글 없음:

댓글 쓰기