'분류 전체보기'에 해당되는 글 2491건

  1. 2008.12.07 [Error] :: Address already in use: JVM_Bind:8080
  2. 2008.12.07 struts2 : Struts Problem Report 는 struts.devMode=true 때문
  3. 2008.12.07 [oracle] ORA-01841: 년은 영이 아닌 -4713 과 +4713 사이의 값으로 지정해야 합니다
  4. 2008.12.04 apache의 common-email 라이브러리를 사용하여 메일을 보내봅시다.
  5. 2008.12.04 LOG4J
  6. 2008.12.02 oracle table drop (오라클 테이블 삭제복구)
  7. 2008.12.01 StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
  8. 2008.12.01 JVM GC와 메모리 튜닝
  9. 2008.12.01 무료 개발툴
  10. 2008.12.01 쉘스크립 을 통한 리눅스 웹서버 보안 코드
  11. 2008.12.01 samba 서버 설치
  12. 2008.12.01 정통부, 보안서버 구축 가이드 배포
  13. 2008.12.01 보안서버 SSL 구동시 비밀번호 자동 입력 및 부팅시 자동 시작
  14. 2008.12.01 SSL 보안인증서 설치
  15. 2008.12.01 보안서버 설치
  16. 2008.12.01 보안서버 구축 가이드
  17. 2008.11.28 Extract All Classes Loaded in the JVM into a Single JAR
  18. 2008.11.28 Java Open Source XInternet WDL
  19. 2008.11.28 Not Clickjacking (Almost Certainly)
  20. 2008.11.28 [잡팁]XP에서 드라이브의 이름 변경하기
  21. 2008.11.28 웹에서 프린터 하기 scriptX
  22. 2008.11.28 oracle 실수로 지운 데이터 살리기
  23. 2008.11.28 정규식 사용하여 sql 쿼리 쉽게 만들기
  24. 2008.11.28 소스변경없이 JDBC를 사용하는(IBATIS, Hibernate등 ORM포함) 모든 SQL logging
  25. 2008.11.28 sql 달력
  26. 2008.11.28 동적 테이블 1
  27. 2008.11.28 html 에서 excel 바로 다운받기
  28. 2008.11.28 ms 동영상 강의 (강추) C++, Visual C++ 외 다수 1
  29. 2008.11.27 Apache 설치방법 보기
  30. 2008.11.27 모바일 개발관련 링크들
98..Etc/error_all2008. 12. 7. 20:25
반응형
오라클이 여러번 발목을 잡는다. ㅋㅋ

톰켓을 설치하는데
java.net.BindException: Address already in use: JVM_Bind:8080
헉?? 엥? ㅋㅋ 8080포트를 쓰는 녀석이 또있었다. 곰곰히 생각해도 내가 곰이네..?
요즘 오라클을 설치하고 만지작거리는데 한참이여서 당연 오라클 문제일꺼라 생각했다.
아무튼 에러야 어쨌든 간에 http://localhost:8080을 쳐 넣었다.
어라? 로그인창이 뜨면서 XDB어쩌구라 하네...ㅎㅎ

Window에서 Oracle 9i를 설치하면서 XDB란 웹서비스도 함께 설치가 된것이다. 그리고 XDB란 녀석은 8080포트를 사용하고 있고.

아무튼 해결책은 XDB의 포트나 톰켓의 포트를 바꿔줘야한다.
방법은 캡쳐라도 하면 좋은텐데...워낙 게으른지라..
DBCA(Database configuration Assistant)를 실행시키고 -> 다음 -> 데이터베이스의 데이터베이스 옵션 구성체크(다음) -> 구성하고자하는 데이터베이스 선택(다음) -> 하단부분(표준 데이터베이스 기능)선택(다음) - > 사용자 정의 -> 포트번호구성|사용자 정의 값 지정
깔끔하게 재부팅~ㅎㅎㅎ
Posted by 1010
51.Struts22008. 12. 7. 20:20
반응형
struts.devMode=true

struts2 에서 어플리케이션을 개발할 때 개발모드로 하면 뭔가 편리한 것을 도와준다는 것 같은데...이넘 때문에 한시간 삽질했다.

어플리케이션에서 unexception이 발생하던가 잘못된 요청이 오면 error.jsp 페이지로 돌려 사용자에게 안내메시지를 뿌려주는 것을 만들었다.

그런데 유독 xxx.action(*.action은 struts가 처리하도록 매핑했음) 으로 끝나는 넘들은 error.jsp로 가지 않고 struts가 아래와 같은 에러페이지를 뿌리는 것이 아닌가?

Struts Problem Report

Struts has detected an unhandled exception:

Messages:
  • There is no Action mapped for namespace / and action name dfasdf.

  • Stacktraces

    There is no Action mapped for namespace / and action name dfasdf. - [unknown location]
        com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186)
        org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:41)
        org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:494)
        org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)

    response 상태도 200으로 떨어지는 것이다.

    struts2 이넘이 내부적으로 뭔가 처리를 하는 것 같은데 왜 이렇게 하는지 알 수가 없었다.

    혼자 엄청 삽질하다가 구글에서 뒤져 보았다. 그랬더니 devMode=true 로 했을 경우 어쩌구 저쩌구 하는 것이 아닌가..
    그래서 혹시나 싶어 devMode=false로 바꾸었더니 정상적으로 내가 원하는 error.jsp로 가더군..

    음..이런 삽질...싫다..ㅠㅠ
    Posted by 1010
    98..Etc/error_all2008. 12. 7. 11:40
    반응형
    ORA-01841: 년은 영이 아닌 -4713 과 +4713 사이의 값으로 지정해야 합니다

    오렌지에서는 잘 도는 쿼리인데 JAVA 프로그램에서만 계속 에러가 발생하네요.



    결국 문제는 날짜값이 문제였습니다.  "99991231" 을 날짜 값으로 넣은 칼럼이 있는데

    거기서 발생하네요.  9i 에서는 99991231 까지는 문제 없는데, 여기다가



    SELECT TO_DATE('99991231','YYYYMMDD') + 1 FROM DUAL;



    이렇네요~



    오라클에서 엔진에서 데이터 검색하는 방법이 사람이 생각하는 것과는 좀 차이가 있어 보입니다.



    앞으로 MAX를 29991231 정도로 해야지..이정도면 나 죽을때 뭐라 하는사람 없겠쥐~






    출처 : http://blog.naver.com/zzangeg1?Redirect=Log&logNo=30472771
    Posted by 1010
    01.JAVA/Java2008. 12. 4. 12:31
    반응형
    1. 필요 Lib
     3가지가 필요합니다.

     : commons-email.jar
     : mail.jar
     : activation.jar


    2. 아래의 링크에서 다운 받으실수 있어요.


    Commons-Email을 사용하기 위해서는 JavaMail의 mail.jar와 JAF의 activation.jar 가 필요합니다

    Commons-Email

    http://jakarta.apache.org/site/downloads/downloads_commons-email.cgi

    JavaMail 1.3

    http://java.sun.com/products/javamail/downloads/index.html

    JAF 1.0.2

    http://java.sun.com/products/javabeans/glasgow/jaf.html




    3. 예제

    Ex1> SimpleEmail

    SimpleEmail email = new SimpleEmail();
    email.setHostName("mail.nate.com");       //ex) nate.com 일 경우!! ->> mail.nate.com
    email.addTo(onamt@nate.com, "받는사람");    //ex) onamt@nate.com
    email.setFrom("onamt@nate.com", "보내는사람");
    email.setSubject("제목을 입력합니다");
    email.setMsg("메일의 내용을 입력합니다.");
    email.send();


    위의 예제는 아주 간단한 예제로 SimpleEmail입니다.

    받는사람, 보내는사람, 호스트, 제목, 내용만을 보낼수 있습니다.



    Ex2> 파일 첨부 메일



    //첨부하실 파일의 정보를 넣습니다.
    EmailAttachment attachment = new EmailAttachment();
    attachment.setPath("mypictures/john.jpg");      //파일의 경로
    attachment.setDisposition(EmailAttachment.ATTACHMENT);      //파일의 형태
    attachment.setDescription("Picture of John");      //파일의 성명
    attachment.setName("John");       // 첨부파일명


    //그 후 MultiPartEmail 을 통해 SimpleEmail 처럼 기본 메일정보를 설정합니다
    MultiPartEmailemail = new MultiPartEmail();
    email.setHostName("mail.nate.com");
    email.addTo("onamt@nate.com", "받는사람");
    email.setFrom("onamt@nate.com", "보내는사람");
    email.setSubject("제목");
    email.setMsg("내용");


    // 마지막으로 MultiPartEmail의 attach() 함수를 통해 첨부 파일을 추가하여 전송합니다
    email.attach(attachment);

    // 메일을 전송합니다
    email.send();


    만약 첨부파일이 여러개라면 EmailAttachment 를 여러개 생성하여 파일 정보를 설정 한 후 attach()를 통해 추가해 주기만 하면 됩니다

     

     

    Ex3>HTML 이메일 보내기

    // 기본 메일 정보를 생성합니다
    HtmlEmailemail = new HtmlEmail();
    email.setHostName("mail.nate.com");
    email.addTo("onamt@nate.com", "받는사람");
    email.setFrom("onamt@nate.com", "보내는사람");
    email.setSubject("제목");


    // 삽입할 이미지와 그 Content Id를 설정합니다
    URL url = new URL("http://www.이미지 경로");

    String contentId = email.embed(url, "Apache logo");


    // HTML 메세지를 설정합니다

    email.setHtmlMsg("<html>뭐뭐뭐뭐뭐뭐뭐</html>");


    // HTML 이메일을 지원하지 않는 사람이면 다음 메세지를 뿌려웁니다
    email.setTextMsg(" HTML 이메일을 지원하지 않습니다..ㅋㅋ");

    // 메일을 전송합니다
    email.send();

    HtmlEmail 클래스는 setHtmlMsg()로 작성된 html을 보낼 수 있습니다

    Posted by 1010
    반응형
    LOG4J

    I. 들어가면서.. 그리고 log4j


    log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다.


    로깅(logging)은 코드의 가독성을 떨어뜨리는 단점이 있지만 애플리케이션에 문제가 있을 때 개발자가 자세한 상황을 파악할 수 있도록 해 주며 테스팅시 빠질 수 없는 요소입니다.


    아마도 여러분들은 여러 어플리케이션이 추가되면서 각 개발자들만의 독특한 로깅방식이 서로 썩이고 얽혀서 화면에 나타나는것을 많이 봤을겁니다 -_-;
    즉 로깅방법을 통일할 필요가 있는것이죠. 모든 개발자가 특정 포맷에 맞추어서 로깅 한다면 한결 로깅하기도 편하겠지요


    오픈 소스 프로젝트인 Log4j는 개발자들이 매우 손쉽고 다양한 형태로 로깅을 할 수 있도록 도와줍니다. 성능또한 우수해 더이상 System.out.println을 사용할 필요가 없습니다.



    II. 다운로드


    다운로드 http://logging.apache.org/log4j/docs/download.html

    매뉴얼 http://logging.apache.org/log4j/docs/documentation.html

    API spec http://logging.apache.org/log4j/docs/api/index.html



    III. LOG4J 구조


    일단 log4j를 잘 모르지만 그 구조만 살짝 살펴보고 넘어갑시다

    log4j는 크게 3가지 요소로 구성되며 그 구조는 다음과 같습니다

    ① Logger(Category) : 로깅 메세지를 Appender에 전달합니다.

    ② Appender : 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지

                       아니면 DB에 저장할 것인지 매개체 역활을 합니다.

    ③ Layout : Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지

                    출력 layout을 결졍합니다.

    쉽죠?



    IV. LOG4J 로깅 레벨


    log4j는 다양한 로깅레벨을 지원합니다.


    ① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.

    ② ERROR : 일반 에러가 일어 났을 때 사용합니다.

    ③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.

    ④ INFO : 일반 정보를 나타낼 때 사용합니다.

    ⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.


    만약 로깅 레벨을 WARN 으로 설정하였다면 그 이상 레벨만 로깅하게 됩니다.

    즉 WARN, ERROR, FATAL 의 로깅이 됩니다.



    V. 샘플코드 1


    jsp에서 사용하는 예제가 없어 만들어 봤습니다.


    test.jsp


    <%@ page contentType="text/html;charset=MS949"
     import="org.apache.log4j.Logger" %>

    <%!
     static Logger logger = Logger.getLogger("test.jsp");
    %>

    <%
    logger.fatal("fatal!!");

    logger.fatal("fatal2!!", new NullPointerException("널입니다요"));

    logger.error("error!", new NumberFormatException());

    logger.error("error!2");

    logger.warn("warn");

    logger.info("info");

    logger.debug("debug");
    %>


    결과 콘솔화면








    static Logger logger = Logger.getLogger("test.jsp");

    static 메소드 getLogger를 통해 logger 인스턴스를 가져옵니다.
    getLogger에는 파라미터로 스트링 혹은 클래스를 사용하는데 jsp에서는 클래스를 파라미터로 주기에는 좀 애매합니다. 그냥 스트링으로 주도록 하지요


    logger.fatal("fatal!!");
    logger.fatal("fatal2!!", new NullPointerException("널입니다요"));
      
    logger에 fatal 레벨의 메세지를 전달합니다. 다음 두가지 메소드를 지원하는군요

    fatal(Object message)

    fatal(Object message, Throwable t)

    각 레벨마다 위처럼 두가지 메소드를 지원합니다.


    지원 메쏘드
    logger.fatal(Object message) logger.fatal(Object message, Throwable t)
    logger.error(Object message) logger.error(Object message, Throwable t)
    logger.warn(Object message) logger.warn(Object message, Throwable t)
    logger.info(Object message) logger.info(Object message, Throwable t)
    logger.debug(Object message) logger.debug(Object message, Throwable t)


    VI. 샘플코드 2


    서블릿의 경우 다음과 같이 코딩하면 되겠군요

    TestServlet.java


    import javax.servlet.*;
    import javax.servlet.http.*;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    public class TestServlet extends HttpServlet {


        static Logger logger = Logger.getLogger(TestServlet.class);


        public void init(ServletConfig config) throws ServletException {
             super.init(config);
        }


        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

             try {
                  ...
       
                  logger.info("Hellow World~");

                  ...

              } catch (Exception e) {
                  logger.error("Error at TestServlet", e);
              }
         }
    }



    VII. LOG4J 설정


    log4j 설정은 프로그램 내에서 할 수 있지만 설정파일을 사용함으로서 좀더 유연하게 log4j환경을 만들 수 있습니다.


    프로그램에서 설정

    <%@ page contentType="text/html;charset=MS949"
     import="org.apache.log4j.*,java.io.* "
    %>

    <%!
     static Logger logger = Logger.getLogger("log4j.jsp");
    %>

    <%
    String layout = "%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n";
    String logfilename = "DailyLog.log";
    String datePattern = ".yyyy-MM-dd ";

    PatternLayout patternlayout = new PatternLayout(layout);
    DailyRollingFileAppender appender = new DailyRollingFileAppender(patternlayout, logfilename, datePattern);
    logger.addAppender(appender);
    logger.setLevel(Level.INFO);
    logger.fatal("fatal!!");
    %>


    property 파일에 설정
    log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으세요



    log4j.rootLogger=INFO, stdout, rolling

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

    log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

    log4j.appender.rolling.File=output.log

    log4j.appender.rolling.Append=true

    log4j.appender.rolling.MaxFileSize=500KB

    log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

    log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

    log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n


    #최상위 카테고리에 INFO로 레벨 설정 및 appender로 stdout, rolling을 정의

    log4j.rootLogger=INFO, stdout, rolling

    #stdout 어펜더는 콘솔에 뿌리겠다는 정의

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    #stdout 어펜더는 patternlayout을 사용하겠다는 정의

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    #페턴은 다음과 같이 포맷팅 하겠다는 것을 정의

    log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n


    #역시나 rolling 어펜더는 파일로 처리한다라고 정의

    log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

    #로그 파일 이름은 output.log

    log4j.appender.rolling.File=output.log

    #true면 톰캣을 내렸다 올려도 파일이 리셋되지 않습니다.

    log4j.appender.rolling.Append=true

    #파일 최대 사이즈는 500KB로 설정

    log4j.appender.rolling.MaxFileSize=500KB

    #파일 포맷은 output.log.2005-03-10 으로 관리하겠다고 정의

    log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

    #역시나 rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의

    log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

    #rolling 어펜더는 패턴 레이아웃 포맷

    log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n



    VIII. 설정 포맷


    로그파일명 포맷 (DatePattern)
    로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.

    형식 설명
    '.'yyyy-MM 매달 첫번째날에 로그파일을 변경합니다
    '.'yyyy-ww 매주의 시작시 로그파일을 변경합니다.
    '.'yyyy-MM-dd 매일 자정에 로그파일을 변경합니다.
    '.'yyyy-MM-dd-a 자정과 정오에 로그파일을 변경합니다.
    '.'yyyy-MM-dd-HH 매 시간의 시작마다 로그파일을 변경합니다.
    '.'yyyy-MM-dd-HH-mm 매분마다 로그파일을 변경합니다.



    PatternLayout 포맷
    로그자체를 어떤 포맷으로 남길지 결정합니다.
    layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.


    형식 설명
    %p debug, info, warn, error, fatal 등의 priority 가 출력된다.
    %m 로그내용이 출력됩니다
    %d 로깅 이벤트가 발생한 시간을 기록합니다.
    포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
    %t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
    %% % 표시를 출력하기 위해 사용한다.
    %n 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
    %c 카테고리를 표시합니다
    예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
    %C 클래스명을 포시합니다.
    예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
    %F 로깅이 발생한 프로그램 파일명을 나타냅니다.
    %l 로깅이 발생한 caller의 정보를 나타냅니다
    %L 로깅이 발생한 caller의 라인수를 나타냅니다
    %M 로깅이 발생한 method 이름을 나타냅니다.
    %r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
    %x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
    %X 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.

    예시) (같은 색끼리 보시면 됩니다)

    위의 test.jsp를 다음 포맷으로 출력해본다면

    [%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t] [%x] [%X]는 다음과 같다

    [test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25] [] []


    =============================================

    본문서는 자유롭게 배포/복사 할수 있지만

    이문서의 저자에 대한 언급을 삭제하시면 안됩니다

    저자 : GoodBug (unicorn@jakartaproject.com)

    최초 : http://www.jakartaproject.com 

    =============================================

    Posted by 1010
    02.Oracle/DataBase2008. 12. 2. 19:01
    반응형
    Posted by 1010
    98..Etc/error_all2008. 12. 1. 14:42
    반응형
    java heep memory ..
    Posted by 1010
    01.JAVA/Java2008. 12. 1. 14:17
    반응형
    JVM GC와 메모리 튜닝




    자바스터디 네트워크 [www.javastudy.co.kr]

    조대협 [bcho_N_O_SPAM@j2eestudy.co.kr]




    모든 Java Application은 JVM(Java Virtual Machine)위에서 동작한다.
    이 JVM이 동작하는데 있어서, 메모리의 구조와 특히 GC는 Application의 응답시간과 성능에 밀접한 관계를 미친다. 이번 강좌에서는 JVM 의 메모리 구조와 GC 알고리즘 (JDK 1.4.X에 포함된 새로운 알고리즘 포함) 그리고, JVM의 메모리 튜닝을 통한 Application의 성능향상방법에 대해서 알아보도록 하자.


    1.GC란 무엇인가?


    GC는 Garbage Collection의 약자로 Java 언어의 중요한 특징중의 하나이다.
    GC는 Java Application에서 사용하지 않는 메모리를 자동으로 수거하는 기능을 말한다.
    예전의 전통적인 언어 C등의 경우 malloc, free등을 이용해서 메모리를 할당하고, 일일이 그 메모리를 수거해줘야했다. 그러나 Java 언어에서는 GC 기술을 사용함에 따라서 개발자로 하여금 메모리 관리에서 부터 좀더 자유롭게 해주었다.


    2.GC의 동작 방법은 어떻게 되는가?


    1) JVM 메모리 영역

    GC의 동작 방법을 이해하기 위해서는 Java의 메모리 구조를 먼저 이해할 필요가 있다.
    일반적으로 Application에서 사용되는 객체는 오래 유지 되는 객체보다, 생성되고 얼마안있어서 사용되지 않는 경우가 많다. <그림 1 참조>


    <그림 1. 메모리 foot print>


    그래서 Java에서는 크게 두가지 영역으로 메모리를 나누는데 Young 영역과 Old 영역이 그것이다.
    Young 영역은 생긴지 얼마 안된 객체들을 저장하는 장소이고, Old영역은 생성된지 오래된 객체를 저장하는 장소이다. 각 영역의 성격이 다른 만큼 GC의 방법도 다르다.
    먼저 Java의 메모리 구조를 살펴보자.


    <그림 2. Java 메모리 구조>


    Java의 메모리 영역은 앞에서 이야기한 두 영역 (Young 영역,Old 영역)과 Perm 영역 이렇게 3가지로 영역으로 구성된다.


    <표 1. Java 메모리 영역>



    2) GC 알고리즘

    그러면 이 메모리 영역을 JVM이 어떻게 관리하는지에 대해서 알아보자.
    JVM은 New/Young 영역과, Old영역 이 두영역에 대해서만 GC를 수행한다. Perm영역은 앞에서 설명했듯이 Code가 올라가는 부분이기 때문에, GC가 일어날 필요가 없다. Perm영역은 Code가 모두 Load되고 나면 거의 일정한 수치를 유지한다.


    ○ Minor GC
    먼저 New/Young영역의 GC방법을 살펴보자 New/Young 영역의 GC를 Minor GC라고 부르는데, New/Young영역은 Eden과 Survivor라는 두가지 영역으로 또 나뉘어 진다. Eden영역은 Java 객체가 생성되자 마자 저장이 되는곳이다. 이렇게 생성된 객체는 Minor GC가 발생할때 Survivor 영역으로 이동된다.

    Survivor 영역은 Survivor 1과 Suvivor2 영역 두 영역으로 나뉘어 지는데, Minor GC가 발생하면 Eden과 Survivor1에 Alive되어 있는 객체를 Suvivor2로 복사한다. 그리고 Alive되어 있지 않는 객체는 자연히 Suvivor1에 남아있게 되고, Survivor1과 Eden영역을 Clear한다. (결과적으로 Alive된 객체만 Survivor2로 이동한것이다.)
    다음번 Minor GC가 발생하면 같은 원리로 Eden과 Survivor2영역에서 Alive되어 있는 객체를 Survivor1에 복사한다. 계속 이런 방법을 반복적으로 수행하면서 Minor GC를 수행한다.

    이렇게 Minor GC를 수행하다가, Survivor영역에서 오래된 객체는 Old영역으로 옮기게 된다.

    이런 방식의 GC 알고리즘을 Copy & Scavenge라고 한다. 이 방법은 매우 속도가 빠르며 작은 크기의 메모리를 Collecting하는데 매우 효과적이다. Minor GC의 경우에는 자주 일어나기 때문에, GC에 소요되는 시간이 짧은 알고리즘이 적합하다.

    이 내용을 그림을 보면서 살펴보도록 하자.


    <그림 3-1. 1st Minor GC>


    Eden에서 Alive된 객체를 Suvivor1으로 이동한다. Eden 영역을 Clear한다.


    <그림 3-2. 2nd Minor GC>


    Eden영역에 Alive된 객체와 Suvivor1영역에 Alive된 객체를 Survivor 2에 copy한다.
    Eden영역과 Suvivor2영역을 clear한다.


    <그림 3-3. 3rd Minor GC>


    객체가 생성된 시간이 오래지나면 Eden과 Suvivor영역에 있는 오래된 객체들을 Old 영역으로 이동한다.


    ○ Full GC

    Old 영역의 Garbage Collection을 Full GC라고 부르며, Full GC에 사용되는 알고리즘은 Mark & Compact라는 알고리즘을 이용한다. Mark & Compact 알고리즘은 전체 객체들의 reference를 쭉 따라가다면서 reference가 연결되지 않는 객체를 Mark한다. 이 작업이 끝나면 사용되지 않는 객체를 모두 Mark가 되고, 이 mark된 객체를 삭제한다.<그림 4 참고> (실제로는 compact라고 해서, mark된 객체로 생기는 부분을 unmark된 즉 사용하는 객체로 메꾸어 버리는 방법이다.)

    Full GC는 매우 속도가 느리며, Full GC가 일어나는 도중에는 순간적으로 Java Application이 멈춰 버리기 때문에, Full GC가 일어나는 정도와 Full GC에 소요되는 시간은 Application의 성능과 안정성에 아주 큰 영향을 준다.


    <그림 4. Full GC>




    3. GC가 왜 중요한가?


    Garbage Collection중에서 Minor GC의 경우 보통 0.5초 이내에 끝나기 때문에 큰문제가 되지 않는다. 그러나 Full GC의 경우 보통 수초가 소요가 되고, Full GC동안에는 Java Application이 멈춰버리기 때문에 문제가 될 수 있다.
    예를 들어 게임 서버와 같은 Real Time Server를 구현을 했을때, Full GC가 일어나서 5초동안 시스템이 멈춘다고 생각해보자.
    또 일반 WAS에서도 5~10초동안 멈추면, 멈추는동안의 사용자의 Request가 Queue에 저장되었다가 Full GC가 끝난후에 그 요청이 한꺼번에 들어오게 되면 과부하에 의한 여러 장애를 만들 수 있다..
    그래서 원할한 서비스를 위해서는 GC를 어떻게 일어나게 하느냐가 시스템의 안정성과 성능에 큰 변수로 작용할 수 있다.


    4. 다양한 GC 알고리즘


    앞에서 설명한 기본적인 GC방법 (Scavenge 와 Mark and compact)이외에 JVM에서는 좀더 다양한 GC 방법을 제공하고 그 동작방법이나 사용방법도 틀리다. 이번에는 다양한 GC 알고리즘에 대해서 알아보자. 현재 (JDK 1.4)까지 나와 있는 JVM의 GC방법은 크게 아래 4가지를 지원하고 있다.

    - Default Collector
    - Parallel GC for young generation (from JDK 1.4 )
    - Concurrent GC for old generation (from JDK 1.4)
    - Incremental GC (Train GC)

    1) Default Collector
    이 GC 방법은 앞에서 설명한 전통적인 GC방법으로 Minor GC에 Scavenge를, Full GC에 Mark & compact 알고리즘을 사용하는 방법이다. 이 알고리즘에는 이미 앞에서 설명했기 때문에 별도의 설명을 하지는 않는다.

    JDK 1.4에서부터 새로 적용되는 GC방법은 Parallel GC와 Concurrent GC 두가지 방법이 있다. Parallel GC는 Minor GC를 좀더 빨리하게 하는 방법이고 (Throughput 위주) Concurrent GC는 Full GC시에 시스템의 멈춤(Pause)현상을 최소화하는 GC방법이다.

    2) Parallel GC
    JDK1.3까지 GC는 하나의 Thread에서 이루어진다. Java가 Multi Thread환경을 지원함에도 불구하고, 1 CPU에서는 동시에 하나의 Thread만을 수행할 수 밖에 없기때문에, 예전에는 하나의 CPU에서만 GC를 수행했지만, 근래에 들어서 하나의 CPU에서 동시에 여러개의 Thread를 실행할 수 있는 Hyper Threading기술이나, 여러개의 CPU를 동시에 장착한 HW의 보급으로 하나의 HW Box에서 동시에 여러개의 Thread를 수행할 수 있게 되었다.

    JDK 1.4부터 지원되는 Parallel GC는 Minor GC를 동시에 여러개의 Thread를 이용해서 GC를 수행하는 방법으로 하나의 Thread를 이용하는것보다 훨씬 빨리 GC를 수행할 수 있다.


    <그림 7. Parallel GC 개념도>


    <그림 7> 을 보자 왼쪽의 Default GC방법은 GC가 일어날때 Thread들이 작업을 멈추고, GC를 수행하는 thread만 gc를 수행한다. (그림에서 파란영역), Parallel GC에서는 여러 thread들이 gc를 수행이 가능하기 때문에, gc에 소요되는 시간이 낮아진다.

    Parallel GC가 언제나 유익한것은 아니다. 앞에서도 말했듯이 1CPU에서는 동시에 여러개의 thread를 실행할 수 없기 때문에 오히혀 Parallel GC가 Default GC에 비해서 느리다. 2 CPU에서도 Multi thread에 대한 지원이나 계산등을 위해서 CPU Power가 사용되기 때문에, 최소한 4CPU의 256M 정도의 메모리를 가지고 있는 HW에서 Parallel GC가 유용하게 사용된다.

    Parallel GC는 크게 두가지 종류의 옵션을 가지고 있는데,Low-pause 방식과 Throughput 방식의 GC방식이 있다.

    Solaris 기준에서 Low-pause Parallel GC는 ?XX:+UseParNewGC 옵션을 사용한다. 이 모델은 Old 영역을 GC할때 다음에 설명할 Concurrent GC방법과 함께 사용할 수 있다. 이 방법은 GC가 일어날때 빨리 GC하는것이 아니라 GC가 발생할때 Application이 멈춰지는 현상(pause)를 최소화하는데 역점을 뒀다.

    Throughput 방식의 Parallel GC는 ?XX:+UseParallelGC (Solaris 기준) 옵션을 이용하며 Old 영역을 GC할때는 Default GC (Mark and compact)방법만을 사용하도록 되어 있다.Minor GC가 발생했을때, 되도록이면 빨리 수행하도록 throughput에 역점을 두었다.

    그외에도 ParallelGC를 수행할때 동시에 몇개의 Thread를 이용하여 Minor영역을 Parallel GC할지를 결정할 수 있는데, -XX:ParallelGCThreads= 옵션을 이용하여 Parallel GC에 사용되는 Thread의 수를 지정할 수 있다.

    3) Concurrent GC

    앞에서도 설명했듯이, Full GC즉 Old 영역을 GC하는 경우에는 그 시간이 길고 Application이 순간적으로 멈춰버리기 때문에, 시스템 운용에 문제가 된다.

    그래서 JDK1.4부터 제공하는 Concurrent GC는 기존의 이런 Full GC의 단점을 보완하기 위해서 Full GC에 의해서 Application이 멈추어 지는 현상을 최소화 하기 위한 GC방법이다.
    Full GC에 소요되는 작업을 Application을 멈추고 진행하는것이 아니라, 일부는 Application이 돌아가는 단계에서 수행하고, 최소한의 작업만을 Application이 멈췄을때 수행하는 방법으로 Application이 멈추는 시간을 최소화한다.


    <그림 8. Concurrent GC 개념도>


    그림 8에서와 같이 Application이 수행중일때(붉은 라인) Full GC를 위한 작업을 수행한다. (Sweep,mark) Application을 멈추고 수행하는 작업은 일부분 (initial-mark, remark 작업)만을 수행하기 때문에, 기존 Default GC의 Mark & Sweep Collector에 비해서 Application이 멈추는 시간이 현저하게 줄어든다.

    Solaris JVM에서는 -XX:+UseConcMarkSweepGC Parameter를 이용해 세팅한다.

    4) Incremental GC (Train GC)

    Incremental GC또는 Train GC라고도 불리는 GC방법은 JDK 1.3에서부터 지원된 GC방법이다. 앞에서 설명한 Concurrent GC와 비슷하게, 의도 자체는 Full GC에 의해서 Application이 멈추는 시간을 줄이고자 하는데 있다.

    Incremental GC의 작동방법은 간단하다. Minor GC가 일어날때 마다 Old영역을 조금씩 GC를 해서 Full GC가 발생하는 횟수나 시간을 줄이는 방법이다.


    <그림 9. Incremental GC 개념도>


    그림 9에서 보듯이. 왼쪽의 Default GC는 FullGC가 일어난후에나 Old 영역이 Clear된다. 그러나, 오른쪽의 Incremental GC를 보면 Minor GC가 일어난후에, Old 영역이 일부 Collect된것을 볼 수 있다.

    Incremental GC를 사용하는 방법은 JVM 옵션에 ?Xinc 옵션을 사용하면 된다.
    Incremental GC는 많은 자원을 소모하고, Minor GC를 자주일으키고, 그리고 Incremental GC를 사용한다고 Full GC가 없어지거나 그 횟수가 획기적으로 줄어드는 것은 아니다. 오히려 느려지는 경우가 많다. 필히 테스트 후에 사용하도록 하자.

    ※ Default GC이외의 알고리즘은 Application의 형태나 HW Spec(CPU수, Hyper threading 지원 여부), 그리고 JVM 버전(JDK 1.4.1이냐 1.4.2냐)에 따라서 차이가 매우 크다. 이론상으로는 실제로 성능이 좋아보일 수 있으나, 운영환경에서는 여러 요인으로 인해서 기대했던것만큼의 성능이 안나올 수 있기 때문에, 실환경에서 미리 충분한 테스트를 거쳐서 검증한후에 사용해야 한다.


    5. GC 로그는 어떻게 수집과 분석


    JVM에서는 GC 상황에 대한 로그를 남기기 위해서 옵션을 제공하고 있다.
    Java 옵션에 ?verbosegc 라는 옵션을 주면되고 HP Unix의 경우 ?verbosegc ?Xverbosegc 옵션을 주면 좀더 자세한 GC정보를 얻을 수 있다. GC 정보는 stdout으로 출력이 되기 때문에 “>” redirection등을 이용해서 file에 저장해놓고 분석할 수 있다.

    Example ) java ?verbosegc MyApplication

    그럼 실제로 나온 GC로그를 어떻게 보는지를 알아보자.


    <그림 5. 일반적인 GC 로그, Windows, Solaris>


    <그림 5>는 GC로그 결과를 모아논 내용이다. (실제로는 Application의 stdout으로 출력되는 내용과 섞여서 출력된다.)
    Minor GC는 ”[GC “로 표기되고, Full GC는 “[Full GC”로 표기된다.
    그 다음값은 Heap size before GC인데,GC 전에 Heap 사용량 ( New/Young 영역 + Old 영역 + Perm 영역)의 크기를 나타낸다.

    Heap size after GC는 GC가 발생한후에 Heap의 사용량이다. Minor GC가 발생했을때는 Eden과 Survivor 영역으 GC가 됨으로 Heap size after GC는 Old영역의 용량과 유사하다.(Minor GC에서 GC되지 않은 하나의 Survivor영역내의 Object들의 크기도 포함해야한다.)

    Total Heap Size는 현재 JVM이 사용하는 Heap Memory양이다. 이 크기는 Java에서 ?ms와 ?mx 옵션으로 조정이 가능한데. 예를 들어 ?ms512m ?mx1024m로 해놓으면 Java Heap은 메모리 사용량에 따라서 512~1024m사이의 크기에서 적절하게 늘었다 줄었다한다. (이 늘어나는 기준과 줄어드는 기준은 (-XX:MaxHeapFreeRatio와 ?XX:MinHeapFreeRation를 이용해서 조정할 수 있으나 JVM vendor에 따라서 차이가 나기때문에 각 vendor별 JVM 메뉴얼을 참고하기 바란다.) Parameter에 대한 이야기는 추후에 좀더 자세히하도록 하자.

    그 다음값은 GC에 소요된 시간이다.

    <그림 5>의 GC로그를 보면 Minor GC가 일어날때마다 약 20,000K 정도의 Collection이 일어난다. Minor GC는 Eden과 Suvivor영역 하나를 GC하는 것이기 때문에 New/Young 영역을 20,000Kbyte 정도로 생각할 수 있다.

    Full GC때를 보면 약44,000Kbyte에서 1,749Kbyte로 GC가 되었음을 볼 수 있다. Old영역에 큰 데이타가 많지 않은 경우이다. Data를 많이 사용하는 Application의 경우 전체 Heap이 512이라고 가정할때, Full GC후에도 480M정도로 유지되는 경우가 있다. 이런 경우에는 실제로 Application에서 Memory를 많이 사용하고 있다고 판단할 수 있기 때문에 전체 Heap Size를 늘려줄 필요가 있다.

    이렇게 수집된 GC로그는 다소 보기가 어렵기 때문에, 좀더 쉽게 분석할 수 있게 하기 위해서 GC로그를 awk 스크립트를 이용해서 정제하면 분석이 용이하다.


    <표 2. gc.awk 스크립트>


    이 스크립트를 작성한후에 Unix의 awk 명령을 이용해서

    % awk ?f gc.awk GC로그파일명

    을 쳐주면 아래<표 3>와 같이 정리된 형태로 GC 로그만 추출하여 보여준다.


    <표 3. gc.awk 스크립트에 의해서 정재된 로그>


    Minor와 Major는 각각 Minor GC와 Full GC가 일어날때 소요된 시간을 나타내며, Alive는 GC후에 남아있는 메모리양, 그리고 Freed는 GC에 의해서 collect된 메모리 양이다.

    이 로그파일은 excel등을 이용하여 그래프등으로 변환해서 보면 좀더 다각적인 분석이 가능해진다.

    ※ JDK 1.4에서부터는 ?XX:+PrintGCDetails 옵션이 추가되어서 좀더 자세한 GC정보를 수집할 수 있다.


    ※ HP JVM의 GC Log 수집

    HP JVM은 전체 heap 뿐 아니라 ?Xverbosegc 옵션을 통해서 Perm,Eden,Old등의 모든 영역에 대한 GC정보를 좀더 정확하게 수집할 수 있다.

    Example ) java ?verbosegc ?Xverbosegc MyApplication ß (HP JVM Only)

    HP JVM의 GC정보는 18개의 필드를 제공하는데 그 내용을 정리해보면 <표 4.>와 같다.

    <GC : %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13 %14 %15 %16 %17 %18>


    <표 4. HP JVM GC 로그 필드별 의미>


    이 로그를 직접 보면서 분석하기는 쉽지가 않다. 그래서, HP에서는 좀더 Visual한 환경에서 분석이 가능하도록 HPJtune이라는 툴을 제공한다. 다음 URL에서 다운로드 받을 수 있다.

    http://www.hp.com/products1/unix/java/java2/hpjtune/index.html


    <그림 6. HP Jtune을 이용해서 GC후 Old영역의 변화 추이를 모니터링하는 화면>




    6. GC 관련 Parameter


    GC관련 설정값을 보기전에 앞서서 ?X와 ?XX 옵션에 대해서 먼저 언급하자. 이 옵션들은 표준 옵션이 아니라, 벤더별 JVM에서 따로 제공하는 옵션이기 때문에, 예고 없이 변경되거나 없어질 수 있기 때문에, 사용전에 미리 JVM 벤더 홈페이지를 통해서 검증한다음에 사용해야한다.

    1) 전체 Heap Size 조정 옵션

    전체 Heap size는 ?ms와 ?mx로 Heap 사이즈의 영역을 조정할 수 있다. 예를 들어 ?ms512m ?mx 1024m로 설정하면 JVM은 전체 Heap size를 application의 상황에 따라서 512m~1024m byte 사이에서 사용하게 된다. 그림2의 Total heap size

    메모리가 모자를때는 heap을 늘리고, 남을때는 heap을 줄이는 heap growing과 shirinking 작업을 수행하는데, 메모리 변화량이 큰 애플리케이션이 아니라면 이 min heap size와 max heap size는 동일하게 설정하는 것이 좋다. 일반적으로 1GB까지의 Heap을 설정하는데에는 문제가 없으나, 1GB가 넘는 대용량 메모리를 설정하고자 할 경우에는 별도의 JVM 옵션이 필요한 경우가 있기때문에 미리 자료를 참고할 필요가 있다.

    ※ IBM AIX JVM의 경우
    %export LDR_CNTRL=MAXDATA=0x10000000
    %java -Xms1500m -Xmx1500m MyApplication

    2) Perm size 조정 옵션

    Perm Size는 앞에서도 설명했듯이, Java Application 자체(Java class etc..)가 로딩되는 영역이다. J2EE application의 경우에는 application 자체의 크기가 큰 편에 속하기 때문에, Default로 설정된 Perm Size로는 application class가 loading되기에 모자른 경우가 대부분이기 때문에, WAS start초기나, 가동 초기에 Out Of Memory 에러를 유발하는 경우가 많다.

    PermSize는 -XX:MaxPermSize=128m 식으로 지정할 수 있다.
    일반적으로 WAS에서 PermSize는 64~256m 사이가 적절하다.

    3) New 영역과 Old 영역의 조정New 영역은 ?XX:NewRatio=2 에 의해서 조정이 된다.
    NewRatio Old/New Size의 값이다. 전체 Heap Size가 768일때, NewRatio=2이면 New영역이 256m, Old 영역이 512m 로 설정이 된다.
    JVM 1.4.X에서는 ?XX:NewSize=128m 옵션을 이용해서 직접 New 영역의 크기를 지정하는 것이 가능하다.

    4) Survivor 영역 조정 옵션
    -XX:SurvivorRatio=64 (eden/survivor 의 비율) :64이면 eden 이 128m일때, survivor영역은 2m가 된다.

    5) -server와 ?client 옵션
    JVM에는 일반적으로 server와 client 두가지 옵션을 제공한다.
    결론만 말하면 server 옵션은 WAS와 같은 Server환경에 최적화된 옵션이고, client옵션은 워드프로세서와 같은 client application에 최적화된 옵션이다. 그냥 언뜻 보기에는 단순한 옵션 하나로보일 수 있지만, 내부에서 돌아가는 hotspot compiler에 대한 최적화 방법과 메모리 구조자체가 아예 틀리다.

    ○ -server 옵션

    server용 application에 최적화된 옵션이다. Server application은 boot up 시간 보다는 user에 대한 response time이 중요하고, 많은 사용자가 동시에 사용하기 때문에 session등의 user data를 다루는게 일반적이다. 그래서 server 옵션으로 제공되는 hotspot compiler는 java application을 최적화 해서 빠른 response time을 내는데 집중되어 있다.

    또한 메모리 모델 역시, 서버의 경우에는 특정 사용자가 서버 운영시간동안 계속 서버를 사용하는게 아니기 때문에 (Login하고, 사용한 후에는 Logout되기 때문에..) 사용자에 관련된 객체들이 오래 지속되는 경우가 드물다. 그래서 상대적으로 Old영역이 작고 New 영역이 크게 배정된다. <그림 7. 참조 >

    ○ -client 옵션

    client application은 워드프로세서 처럼 혼자 사용하는 application이다. 그래서 client application은 response time보다는 빨리 기동되는데에 최적화가 되어 있다. 또한대부분의 client application을 구성하는 object는GUI Component와 같이 application이 종료될때까지 남아있는 object의 비중이 높기 때문에 상대적으로 Old 영역의 비율이 높다.


    <그림 7. ?server와 ?client 옵션에 따른 JVM Old와 New영역>


    이 두옵션은 가장 간단한 옵션이지만, JVM의 최적화에 아주 큰부분을 차지하고 있는 옵션이기 때문에, 반드시 Application의 성격에 맞춰서 적용하기 바란다.
    (※ 참고로, SUN JVM은 default가 client, HPJVM는 default가 server로 세팅되어 있다.)

    ○ GC 방식에 대한 옵션

    GC 방식에 대한 옵션은 앞에서도 설명했지만, 일반적인 GC방식이외에, Concurrent GC,Parallel GC,Inceremental GC와 같이 추가적인 GC Algorithm이 존재한다. 옵션과 내용은 앞장에서 설명한 “다양한 GC알고리즘” 을 참고하기 바란다.


    7.JVM GC 튜닝


    그러면 이제부터 지금까지 설명한 내용을 기반으로 실제로 JVM 튜닝을 어떻게 하는지 알아보도록 하자.

    STEP 1. Application의 종류와 튜닝목표값을 결정한다.

    JVM 튜닝을 하기위해서 가장 중요한것은 JVM 튜닝의 목표를 설정하는것이다. 메모리를 적게 쓰는것이 목표인지, GC 횟수를 줄이는것이 목표인지, GC에 소요되는시간이 목표인지, Application의 성능(Throughput or response time) 향상인지를 먼저 정의한후에. 그 목표치에 근접하도록 JVM Parameter를 조정하는것이 필요하다.

    STEP 2. Heap size와 Perm size를 설정한다.

    -ms와 ?mx 옵션을 이용해서 Heap Size를 정한다. 일반적으로 server application인 경우에는 ms와 mx 사이즈를 같게 하는것이 Memory의 growing과 shrinking에 의한 불필요한 로드를 막을 수 있어서 권장할만하다.

    ms와mx사이즈를 다르게 하는 경우는 Application의 시간대별 memory 사용량이 급격하게 변화가 있는 Application에 효과적이다.
    PermSize는 JVM vendor에 따라 다소 차이가 있으나 일반적으로 16m정도이다. Client application의 경우에는 문제가 없을 수 있지만, J2EE Server Application의 경우 64~128m 사이로 사용이 된다.

    Heap Size와 Perm Size는 아래 과정을 통해서 적정 수치를 얻어가야한다.

    STEP 3. 테스트 & 로그 분석.

    JVM Option에 GC 로그를 수집하기 위한 ?verbosegc 옵션을 적용한다. (HP의 경우 ?Xverbosegc 옵션을 적용한다.)

    LoadRunner나 MS Strest(무료로 MS社의 홈페이지에서 다운로드 받을 수 있다.)와 같은 Strest Test툴을 통해서 Application에 Strest를 줘서. 그 log를 수집한다. 튜닝에서 있어서 가장 중요한것은 목표산정이지만, 그만큼이나 중요한것은 실제 Tuning한 Parameter가 Application에 어떤 영향을 주는지를 테스트하는 방법이 매우 중요하다. 그런 의미에서 적절한 Strest Tool의 선정과, Strest Test 시나리오는 정확한 Tuning을 위해서 매우 중요한 요인이다.

    ○ Perm size 조정
    아래 그림8.은 HP JVM에서 ?Xverbosegc 옵션으로 수집한 GC log를 HP Jtune을 통해서 graph로 나타낸 그래프이다. 그림을 보면 Application이 startup되었을때 Perm 영역이 40m에서. 시간이 지난후에도 50m 이하로 유지되는것을 볼 수 있다. 특별하게 동적 classloading등이 수십m byte가 일어나지 않는등의 큰 변화요인이 없을때, 이 application의 적정 Perm 영역은 64m로 판단할 수 있다.


    <그림 8. GC 결과중 Perm 영역 그래프>


    ○ GC Time 수행 시간 분석

    다음은 GC에 걸린 시간을 분석해보자. 앞에 강좌 내용에서도 설명햇듯이. GC Tuning에서 중요한 부분중 하나가 GC에 소요되는 시간 특히 Full GC 시간이다.

    지금부터 볼 Log는 모社의 물류 시스템의 WAS 시스템 GC Log이다. HP JVM을 사용하며, -server ?ms512m ?mx512m 옵션으로 기동되는 시스템이다.

    그림 9를 보면 Peak 시간 (첫번째 동그라미) 14시간동안에 Full GC(동그란점)가 7번일어난것을 볼 수 있다. 각각에 걸린 시간은2.5~6sec 사이이다.
    여기서 STEP 1.에서 설정한 AP Tuning의 목표치를 참고해야하는데.

    Full GC가 길게 일어나서 Full GC에 수행되는 시간을 줄이고자 한다면 Old 영역을 줄이면 Full GC가 일어나는 횟수는 늘어나고, 반대로 Full GC가 일어나는 시간을 줄어들것이다.

    반대로 Full GC가 일어나는 횟수가 많다면, Old 영역을 늘려주면 Full GC가 일어나는 횟수는 상대적으로 줄어들것이고 반대로 Full GC 수행시간이 늘어날 것이다.

    특히 Server Application의 경우Full GC가 일어날때는 JVM자체가 멈춰버리기 때문에, 그림 9의 instance는 14시간동안 총 7번 시스템이 멈추고, 그때마다 2.5~6sec가량 시스템이 response를 못하는 상태가 된것이다. 그래서 멈춘 시간이 고객이 납득할만한 시간인지를 판단해야 하고, 거기에 적절한 Tuning을 해야한다.

    Server Application에서 Full GC를 적게일어나게하고, Full GC 시간을 양쪽다 줄이기 위해서는 Old영역을 적게한후에, 여러개의 Instance를 동시에 뛰어서 Load Balancing을 해주면, Load가 분산되기 때문에 Full GC가 일어나는 횟수가 줄어들테고, Old 영역을 줄였기 때문에, Full GC에 드는 시간도 줄어들것이다. 또한 각각의 FullGC가 일어나는동안 하나의 서버 instance가 멈춰져 있어도, Load Balancing이 되는 다른 서버가 response를 하고 있기때문에, Full GC로 인한 Application이 멈추는것에 의한 영향을 최소화할 수 있다.


    <그림 9. GC 소요시간>


    데이타에 따라서 GC Tuning을 진행한후에는 다시 Strest Test를 진행해서 응답시간과 TPS(Throughput Per Second)를 체크해서 어떤 변화를 주었는지를 반드시 체크해봐야한다.


    <그림 10. GC후의 Old 영역>


    그림 10은 GC후에 Old 영역의 메모리 변화량을 나타낸다.

    금요일 업무시간에 메모리 사용량이 올라가다가. 주말에가서 완만한 곡선을 그리는것을 볼 수 있다. 월요일 근무시간에 메모리 사용량이 매우 많고, 화요일에도 어느정도 메모리 사용량이 있는것을 볼 수 있다. 월요일에 메모리 사용량이 많은것을 볼때, 이 시스템의 사용자들이 월요일에 시스템 사용량이 많을 수 있다고 생각할 수 있고, 또는 다른 주의 로그를 분석해봤을때 이 주만 월요일 사용량이 많았다면, 특별한 요인이나 Application 변경등이 있었는지를 고려해봐야할것이다.

    이 그래프만을 봤을때 Full GC가 일어난후에도 월요일 근무시간을 보면 Old 영역이 180M를 유지하고 있는것을 볼 수 있다. 이 시스템의 Full GC후의 Old영역은 80M~180M를 유지하는것을 볼 수 있다. 그래서 이 시스템은 최소 180M이상의 Old 영역을 필요로하는것으로 판단할 수 있다.

    STEP 4. Parameter 변경.
    STEP 3에서 구한 각 영역의 허용 범위를 기준으로 Old영역과 New 영역을 적절하게 조절한다.
    PermSize와 New영역의 배분 (Eden,Survivor)영역등을 조정한다.
    PermSize는 대부분 Log에서 명확하게 나타나기 때문에, 크게 조정이 필요가 없고 New영역내의 Eden과 Survivor는 거의 조정하지 않는다. 가장 중요한것은 Old영역과 New 영역의 비율을 어떻게 조정하는가가 관건이다.

    이 비율을 결정하면서, STEP1에서 세운 튜닝 목표에 따라서 JVM의 GC Algorithm을 적용한다. GC Algorithm을 결정하는 기본적인 판단 내용은 아래와 같다.



    이렇게 Parameter를 변경하면서 테스트를 진행하고, 다시 변경하고 테스트를 진행하는 과정을 거쳐서 최적의 Parameter와 GC Algorithm을 찾아내는것이 JVM의 메모리 튜닝의 이상적인 절차이다.


    지금까지 JVM의 메모리 구조와 GC 모델 그리고 GC 튜닝에 대해서 알아보았다.

    정리하자면 GC 튜닝은 Application의 구조나 성격 그리고, 사용자의 이용 Pattern에 따라서 크게 좌우 되기때문에, 얼마만큼의 Parameter를 많이 아느냐 보다는 얼마만큼의 테스트와 로그를 통해서 목표 값에 접근하느냐가 가장 중요하다.

     
    Posted by 1010
    98..Etc/C2008. 12. 1. 13:34
    반응형
    설치는 알아서...


    Posted by 1010
    61.Linux2008. 12. 1. 13:12
    반응형
    쉘스크립 을 통한 리눅스 웹서버 보안 코드

    cat LinuxKernelCustom.sh

    -----------------------------------
    #!/bin/sh
    #
    # apache Optimizer
    #

    IPADDR="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"


    # Usage : [IPADDR] is system ip address include
           
    case "$1" in
            start)
            echo -n "Starting ${IPADDR} TCP.IP Network Optimize..........................";
            echo;
            echo;
            # 브로드캐스트(Broadcast) 요청에 반응하지 않도록 설정
            eval 'sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1';
           
            # SyncFlooding 공격대응
            eval 'sysctl -w net.ipv4.tcp_max_syn_backlog=1280';
            eval 'sysctl -w net.ipv4.tcp_syncookies=1';
            # Proxy ARP 미설정
            eval 'sysctl -w net.ipv4.conf.eth0.proxy_arp=0';
            eval 'sysctl -w net.ipv4.conf.lo.proxy_arp=0';
            eval 'sysctl -w net.ipv4.conf.default.proxy_arp=0';
            eval 'sysctl -w net.ipv4.conf.all.proxy_arp=0';


            # TCP SYN Cookie 방어 설정
            eval 'sysctl -w net.ipv4.tcp_syncookies=1';


            # ICMP 리다렉트(REDIRECT) 차단 설정
            eval 'sysctl -w net.ipv4.conf.all.accept_redirects=0';
            eval 'sysctl -w net.ipv4.conf.lo.accept_redirects=0';
            eval 'sysctl -w net.ipv4.conf.eth0.accept_redirects=0';
            eval 'sysctl -w net.ipv4.conf.default.accept_redirects=0';


            # 부적합한 오류 메세지 로그기록 설정
            eval 'sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1';


            # IP 스푸칭(SPOOFING) 차단 설정
            eval 'sysctl -w net.ipv4.conf.all.rp_filter=1';
            eval 'sysctl -w net.ipv4.conf.lo.rp_filter=1';
            eval 'sysctl -w net.ipv4.conf.eth0.rp_filter=1';
            eval 'sysctl -w net.ipv4.conf.default.rp_filter=1';
           
            # 소스 라우팅(source routing) 패킷 거부 설정
            eval 'sysctl -w net.ipv4.conf.all.accept_source_route=0';
            eval 'sysctl -w net.ipv4.conf.lo.accept_source_route=0';
            eval 'sysctl -w net.ipv4.conf.eth0.accept_source_route=0';
            eval 'sysctl -w net.ipv4.conf.default.accept_source_route=0';


            # 스푸핑, 소스 라우팅 및 리다이렉트 패킷 로그기록 설정
            eval 'sysctl -w net.ipv4.conf.all.log_martians=1';
            eval 'sysctl -w net.ipv4.conf.lo.log_martians=1';
            eval 'sysctl -w net.ipv4.conf.eth0.log_martians=1';
            eval 'sysctl -w net.ipv4.conf.default.log_martians=1';


            # TCP/IP 네트워크 최적화
            eval 'sysctl -w net.ipv4.tcp_fin_timeout=30';
            eval 'sysctl -w net.ipv4.tcp_keepalive_time=180';
            eval 'sysctl -w net.ipv4.tcp_window_scaling=0';
            eval 'sysctl -w net.ipv4.tcp_sack=0';
            eval 'sysctl -w net.ipv4.tcp_timestamps=0';


            # BUFFER-SPACE 최적화 (RAM 2GB 이상일 경우)
            eval 'sysctl -w net.ipv4.tcp_mem=100000000';
            eval 'sysctl -w net.ipv4.tcp_wmem=100000000';
            eval 'sysctl -w net.ipv4.tcp_rmem=30000000';


            # BUFFER-SIZE 최적화 (RAM 2GB 이상일 경우)
            eval 'sysctl -w net.core.rmem_max=10485760';
            eval 'sysctl -w net.core.rmem_default=10485760';
            eval 'sysctl -w net.core.wmem_max=10485760';
            eval 'sysctl -w net.core.wmem_default=10485760';

            # TCP_MAX_BUCKETS 설정 (RAM 2GB 이상일 경우)
            eval 'sysctl -w net.ipv4.tcp_max_tw_buckets=2000000';


            # IP_LOCAL_PORT_RANGE 설정
           #eval 'sysctl -w net.ipv4.ip_local_port_range=32768 61000';


            # IPFRAG_HIGH_THRESH IPFRAG_LOW_THRESH 설정 (RAM 2GB 이상일 경우)
            eval 'sysctl -w net.ipv4.ipfrag_high_thresh=2069496';
            eval 'sysctl -w net.ipv4.ipfrag_low_thresh=2019432';


            # OPTMEM_MAX HOT_LIST_LENGTH 설정 (RAM 2GB 이상일 경우)
            eval 'sysctl -w net.core.optmem_max=10000000';
            #eval 'sysctl -w net.core.hot_list_length=102400';
            #
            ;;
            status)
            sysctl -a
            ;;
            *)
            echo "Usage: apache_optimizer.sh {start|status}"
            exit 1;
    esac;
    echo;
    echo "......Done";
    exit 0;

    ---------------------------------------------------------

    chmod 700 LinuxKernelCustom.sh


    ./LinuxKernelCustom.sh start

    ./LinuxKernelCustom.sh status ->확인

    Posted by 1010
    98..Etc/Server2008. 12. 1. 13:05
    반응형

    ㅁ samba 패키지 복사
     samba-3.0.23c-2.i386.rpm

    ㅁ 패키지 설치
     rpm -Uvh samba-3.0.23c-2.i386.rpm

    ㅁ samba 설정
     /etc/samba/smb.conf 파일 수정

    ㅁ samba 사용자 추가
     smbpasswd -a 계정명

    ㅁ 서비스 재시작
     service network restart
     service smb restart


    ㅁ 기타 삼바 관련 자료
    ***********************************************************
    * SAMBA 서버
    ***********************************************************

    * 설치
    삼바서버패키지 : samba-3.0.8-0.pre1.3
    삼바클라이언트 패키지 : samba-client-3.0.8-0.pre1.3
    삼바서버와 클라이언트에서 모두 사용하는 파일들 패키지 : samba-common-3.0.8-0.pre1.3
    삼바서버 웹관리 패키지 : samb-swat-3.0.8-0.pre1.3
    삼바서버 설정툴 패키지 : system-config-samba-1..21-1


    # wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-3.0.8-0.pre1.3.rpm
    # wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-client-3.0.8-0.pre1.3.rpm
    # wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-common-3.0.8-0.pre1.3.rpm
    # wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samb-swat-3.0.8-0.pre1.3.rpm
    # wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/system-config-samba-1..21-1.rpm
    # rpm -Uvh --nodeps samba-3.0.8-0.pre1.3.rpm
    # rpm -Uvh --nodeps samba-client-3.0.8-0.pre1.3.rpm
    # rpm -Uvh --nodeps samba-common-3.0.8-0.pre1.3.rpm
    # rpm -Uvh --nodeps samb-swat-3.0.8-0.pre1.3.rpm
    # rpm -Uvh --nodeps system-config-samba-1..21-1.rpm


    설치된 주요 파일들
    /etc/logrotate.d/samba : 삼바로그를 관리하기 위한 삼바로그 로테이트 스크립트 파일
    /etc/init.d/smb : 삼바데몬(nmbd, smbd)을 실행(종료, 재시작)하기 위한 스크립트파일
    /etc/sysconfig/samba :삼바 제어판 설정파일
    /usr/bin/smbstatus : 삼바서버에 로그인한 정보를 확인하기 위한 유틸리티
    /usr/sbin/nmbd : 삼바 NetBIOS 데몬
    /usr/sbin/smbd : 윈도우서버와 파일 및 프린터공유를 위한 삼바 주데몬
    /usr/bin/smbclient : 삼바 클라이언트 유틸리티로서 삼바서버로 접속이 가능하도록 제공함.
    /usr/bin/smbmount : 삼바 원격마운트 유틸리티
    /usr/bin/smbumount : 삼바 원격마운트 해제 유틸리티
    /etc/samba : 삼바의 주된 디렉토리
    /etc/samba/lmhosts : 삼바서버 NetBIOS 호스트파일(삼바서버에서 사용하는 호스트정보파일)
    /etc/samba/smb.conf : 삼바서버의 주설정파일
    /usr/bin/smbpasswd : 삼바사용자 생성, 삭제 및 삼바사용자 패스워드 설정, 변경 유틸리티
    /usr/bin/testparm : 삼바서버 설정파일(smb.conf)점검 유틸리티
    /etc/xinetd.d/swat : 삼바서버의 웹관리를 위한 xinetd환경의 삼바설정파일
    /usr/sbin/swat : 삼바서버 웹관리툴
    /usr/bin/system-config-samba : X환경에서의 삼바설정 유틸리티
    /var/log/samba/ : 삼바로그 저장 디렉토리
    /etc/samba/smbusers : 리눅스ID와 삼바ID가 다를 경우에 이를 매칭하기 위한 매칭 테이블파일


    * 삼바서비스 데몬
    - 삼바데몬 시작
    # /etc/init.d/smb start
    # /usr/sbin/smbd -D
    # /usr/sbin/nmbd -D


    * 삼바 설정파일 smb.conf 다루기
    /etc/samba/smb.conf 파일의 설정에는 다음과 같이 기본적으로 세부분으로 나뉘어져 있습니다.
      1. 글로벌 설정: 이 설정은 삼바서버가 공유하는 자원들에 공통적으로 적용할 기본값을 설정하는 곳이다.
                      이 글로벌설정은 [global]이라는 선언으로 시작하는 부분이다.
      2. 자동홈디렉토리 : 리눅스 사용자들의 홈디렉토리를 로그인홈으로 사용하기 위한 설정으로서 [homes]로 시작하는 부분의 설정이다.
      3. 프린터설정 : 네트워크 공유프린트에 대한 설정부분으로서 [printers]로 시작하는 부분의 설정이다.


    - unix charset = cp949
      dos charset = cp949
      display charset = cp949
      리눅스(유닉스) 문자셋, 도스문자셋, 그리고 디스플레이 문자셋을 각각 설정한다.


    - workgroup = superuser
      workgroup옵션에는 NT도메인명 또는 워크그룹명을 지정하면 된다.
      작업그룹명이므로 윈도우에서 Workgroup으로 사용하는 이름을 입력한다.


    - server string = SUPERUSER File Server
      삼바서버의 이름쯤으오 생각하면 된다.


    - hosts allow = 192.168.1. 192.168.2. 127.
      이 옵션은 삼바서버의 보안을 위하여 매우 중요한 옵션이다.
      이 옵션은 삼바서버로의 접근을 허용하기 위한 설정이다.


    - load printers = yes
      자동프린트 목록을 사용하기 위한 값으로 yes를 주면 된다.
      네트워크 프린터를 삼바서버에서 관리하도록 하려면 반드시 yes로 설정한다.


    - printcap name = /etc/printcap
      printcap파일의 위치가 다른 곳에 있다면 그곳을 지정한다.


    - printing = bsd
      사용하는 프린터가 표준이 아니라면 주석처리를 하는 것이 좋다.
      현재 지원되는 프린터시스템의 종류로는 bsd, sysv, plp, lprng, aix, hpux, qnx 등이 있다.


    - guest account =pcguest
      삼바서버의 guest사용자를 허용하고자 할 때에는 이 주석을 제거한다.
      이 옵션은 삼바서버에 손님권한으로 접속할 때 어떤 권한을 부여할 것인가를 설정한다.
      가능한 시스템에 특별한 권한이 없는 nobody와 같은 권한으로 설정한다.


    - log file = /var/log/samba/log.%m
      이 설정은 삼바서버로 접속하는 개별 사용자들의 호스트정보를 %m 으로 받아서 개별 로그파일을 생성하도록 한다.
    - log file = /var/log/samba/smbd.log
      접속한 호스트별로 로그파일을 사용하지 않는다면 하나의 로그파일을 사용할 수도 있다.


    - max log size = 50
      로그파일의 용량크기를 KB단위로 제한하기 위한 옵션이다.
      제한하지 않으려면 0을 입력한다.


    - security = share
      보안모드를 설정하는 것으로서 대부분의 삼바접속자들에게는 user레벨이 가장 알맞다.
      user레벨을 설정하면 삼바서버에 접속하는 사용자는 반드시 윈도우에서 사용하는 로그인ID와 동일해야 한다.
      만약 위의 설정과 같이 share레벨은 공유디렉토리등에 설정하는 것으로서 ID와 패스워드의 인증엇이 접속하는 것을 허용하는 레벨이다.
      또한 server레벨은 별도의 인증서버에서 ID와 패스워드인증을 받도록하는 레벨이다.
      가능하면 삼바서버보안을 위하여 user레벨을 사용하는 것이 좋다.


    - password server = <NT-Server-Name>
      위의 security 옵션값이 server로 설정되었을 때에만 설정할 수 있는 옵션으로서 인증서버로 사용할 서버를 지정하는 옵션이다.


    - password level = 8
      패스워드 문자로 대소문자를 조합하여 사용할 문자의 개수를 지정한 옵션이다.


    - username level = 8
      삼바사용자명을 대소문자 조합하여 사용할 문자의 개수를 지정한 옵션이다.


    - encrypt passwords = yes
      패스워드를 암호화하여 사용하려면 "encrypt passwords" 옵션값을 yes로 설정한다.


    - smb passwd file = /etc/samba/smbpasswd
      이 옵션은 삼바사용자들의 암호파일의 위치를 지정한 것이다.


    - unix password sync = Yes
      passwd program = /usr/bin/passwd %u
      passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authenticateion*tokens*updated*successfully*
      삼바사용자가 원격지에서 삼바패스워드를 변경할 수 있도록 하기위한 설정이다.
      이 설정을 사용하여 원격에서 패스워드를 변경하도록 허용하려면 앞의 encrypt passwords옵션값에 yes라고 해야하고 smb passwd file옵션에 반드시 삼바사용자패스워드파일의 경로를 지정한다.


    - username map = /etc/samba/smbusers
      대부분 삼바에서 사용하는 ID와 리눅스계정ID는 동일하게 사용한다.
      만약 삼바사용자명과 리눅스 계정사용자명을 다르게 사용할 경우에 이를 매칭할 수 있도록 하기 위한 옵션이다.
      매칭테이블 파일을 /etc/samba/smbusers 파일로 사용하는 설정이다.


    - include = /etc/samba/smb.conf.%m
      이 옵션은 삼바접속자의 플랫폼에 따라서 각기 다른 설정파일을 적용할 수 있도록 지원하기 위해 사용하는 옵션이다.
      %m 은 접속자 시스템의 NetBIOS이름으로 대체되어 접속한 사용자의 플랫폼종류에 따라서 각기 다른 삼바설정파일을 적용할 수 있다.


    - socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
      삼바서비스 성능향상을 위한 옵션이다. speed.txt 파일을 참조하라.


    - interfaces = 192.168.12.2/24 192.168.13.2/24
      삼바서버에서 두개 이상의 네트워크 인터페이스(NIC)를 사용하도록 지원하기 위한 옵션이다.


    - remote browse sync = 192.168.3.25 92.168.5.255
      remote annouce = 192.168.1.255 192.168.2.44
      지역서브넷에서 삼바서버를 잘 인식하도록 하기 위하여 자기자신을 알리도록 한다.


    - local master = no
      이 옵션은 특정 서브네트워크내에서 삼바서버가 로컬마스트브라우즈가 되도록 하는 옵션이다.


    - os level = 33
      이 옵션은 마스터브라우즈 선거(master browser elections)에서 이 서버의 우선구너을 가질 수 있도록 허용한다.


    - domain master = yes
      삼바서버가 Domain Master Browser가 되도록 한다.
      삼바가 Domain Master Browser가 되면 서브네트워크들로부터 브라우즈 목록을 수집하는 역할을 한다.


    - domain logons = yes
      삼바서버를 윈도우95기반의 워크스테이션에 대한 도메인로그인서버 역할을 하도록 하려면 이 옵션을 사용하라.


    - logon script = %m.bat
      각 플랫폼별 또는 각 사용자별로 로그온스크립트(login script)를 구분하여 사용할 수 있도록 한다.


    - logon path = \\%L\Profiles\%U
      오직 윈도우95 또는 윈도우NT에서 로우빙프로파일(roving profile)을 어디에 저장해 둘것인가를 지정하는 설정이다.


    - wins support = yes
      윈도우 인터넷네임서비스인 WINS를 지우너하기 위한 섹션이다.


    - wins server = w.x.y.z
      WINS 서버를 지정한다.


    - wins proxy = yes
      WINS프락시 : WINS기능이 없는 클라이언트 대신 질의에 답하도록 하기위한 옵션이다.


    - dns proxy = no
      DNS의 nslookup을 사용하여 NetBIOS이름을 찾을 것인가 아닌가를 지정하는 옵션이다.


    - preserve case = no
      short preserve case = no
      대소문자를 유지보존할 것인가를 지정하는 옵션이다.


    - default case = lower
      DOS파일들의 기본 문자는 대문자로 인식한다.
      만약 lower로 설정하면 소문자로 인식한다.


    - case sensitive = no
      대소문자의 구분을 할것인가 말것인가를 지정하는 옵션이다.


    - [homes]
      comment = Home Directories
      browseable = no
      writable = yes
      사용자들의 홈디렉토리서버스에서 사용하는 기본적인 설정값이다.


    - [netlogon]
      comment = Network Logon Service
      path = /home/netlogon
      guest ok = yes
      writable = no
      share modes = no
      도메인로그온 기능을 사용하기 위한 netlogin을 위한 설정이다.


    - [Profiles]
      path = /home/profiles
      browseable = no
      guest ok = yes
      로우빙프로파일(roving profile)을 지정하려면 주석을 제거한다.


    - [printers]
      comment = All Printers
      path = /var/spool/samba
      browseable = no
      guest ok = no
      writable = no
      printable = yes
      BSD타이의 프린트시스템을 가지고 있다면 개별 설정없이 바로 사용할 수 있다.


    - [tmp]
      comment = Temporary file space
      path = /tmp
      read only = no
      public = yes
      삼바사용자들의 임시공유 디렉토리로 사용하기 위한 설정이다.


    - [public]
      comment = Public Stuff
      path = /home/samba/public
      public = yes
      read only = no
      write list = @staff


      삼바사용자라면 누구나 접근이 가능한 공유디렉토로서 staff그룹에 등록된 사용자들을 제외한 일반사용잗ㄹ은 읽기전용으로만 사용할 수 있다.


    * 삼바클라이언트 유틸리티 smbclient
    사용형식 : smbclient '\\서버\서비스' [-U 삼바사용자] [패스워드] [옵션]
    # smbclient -L localhost  -> 리눅스서버에 설치되어 있는 삼바서버의 접속 및 운용상태 확인
    # smbclient '\\files\papa' -U papa -> 원격지의 file이라는 로스트로 papa라는 계정을 이용하여 삼바서버로 접속
      서버명으로 file이라는 호스트명을 사용하려면 /etc/samba/lmhosts파일에 호스트정보가 등록되어 있어야 한다.
    # smbclient -L 192.168.0.100
    # smbclient -U papa -L 192.168.0.100


    * 삼바 원격마운트를 위한 smbmount와 smbumount
    사용형식 : smbmount //호스트명(또는 IP)/서비스 /마운트포인트
               smbumount /마운트포인트
    # smbmount //192.168.0.100 /tmp/share
    # smbumount /tmp/share


    * 삼바 사용자 관리
    - 새로운 삼바사용자 생성과 패스워드 설정하기
      삼바서버에서 사용자를 드록하기 위해서는 smbpasswd라는 명령어를 사용한다.
      삼바사용자의 삼바패스워드 또는 smbpasswd라는 명령어를 사용한다.
      삼바사용자를 새로 생성하기 전에 리눅스 계정생성을 먼저해야 한다.
    # useradd dhan
    # passwd dhan
    # smbpasswd -a dhan
    - 삼바사용자 패스워드 변경하기
      root 사용자일 경우 : smbpasswd [options] [username]
      root 사용자가 아닌 경우 : smbpasswd [options]
    - 삼바사용자 사용하지 못하도록 사용중지 설정하기
    # smbpasswd -d dhan -> 사용 중지
    # smbpasswd -e dhan -> 사용 재개
    - 삼바사용자 삭제하기
    # smbpasswd -x dhan


    * 삼바서버의 로그인정보 확인을 위한 smbstatus
    사용형식 : smbstatus [-P] [-b] [-d] [-L] [-p] [-S] [-s <설정파일>] [-u 삼바계정]
    # smbstatus  -> 현재 삼바서버로 로그인되어 있는 사용자들을 확인
    # smbstatus -b  -> 삼바서버로 로그인한 삼바사용자염을 간단하게 확인
    # smbstatus -u papa -> 특정 계정의 삼바사용자의 로그인 정보만을 확인


    * 삼바서버의 NetBIOS 호스트 파일 lmhosts
    이 파일의 주된 목적은 삼바에서 사용할 호스트명정보(주로 IP주소)를 쉽게 찾을 수 있돍 하기위한 것이다.
    이 파일에 등록된 호스트정보를 이용하여 smbclient와 같은 삼바유틸리티에서 등록된 호스트의 삼바서버로 접속할 때에 호스트명만으로 사용할 수 있다.


    * 삼바설정파일 점검하기 위한 testparm
    사용형식 : testparm [-s] [-h] [-x] [-L <서버명>] 설정파일명 [호스트 IP]
    # testparm
    # testparm -l 192.168.0.100


    * 삼바서버를 이용한 웹폴더 구축
    - 웹폴더 사용을 위한 삼바서버 설정
    # useradd dhan
    # passwd dhan
    Changing password for user dhan.
    New password:
    Retype new password:
    passwd: all authentication tokens updated successfully.
    # smbpasswd -a dhan
    New SMB password:
    Retype new password:
    Added user dhan.
    # vi /etc/samba/smb.conf
    [dhan]
    comment dhan web folder
    path = /home/dhan
    valid users = dhan
    read only = no
    writable = yes
    public = no
    browseable = yes
    printable = no
    crate mask = 0750
    # /etc/init.d/smb restart
    - 개인 PC의 탐색기에서 운격삼바디스크 사용하기
    - 웹브라우즈에서 웹폴더 형식으로 사용하기


    출처 : http://bronks.tistory.com/75

    Posted by 1010
    98..Etc/Server2008. 12. 1. 12:58
    반응형
    정통부, 보안서버 구축 가이드 배포


    이 가이드는
    ▲보안서버의 종류와 구축 절차
    ▲SSL방식 보안서버 구축 요령
    ▲응용프로그램방식 보안서버 구축 요령
    ▲웹호스팅업체의 보안서버 구축 요령
    ▲웹 페이지 적용 방법
    등이 제시되어 보안서버를 설치하려는 웹사이트 운영자에게 실질적인 도움을  주도록 기획되었다.
    Posted by 1010
    98..Etc/Server2008. 12. 1. 11:54
    반응형

    보안서버를 구축하게 되면 아래와 같이 구동 시에 비밀번호를 입력해야 합니다. 이때 간단한 설정으로 자동으로 비밀번호를 입력할 수 있습니다.

    가. 비밀번호 자동 입력

    [root@smson bin]# ./apachectl startssl
    [Thu Oct 30 15:18:43 2008] [alert] httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
    Apache/1.3.33 mod_ssl/2.8.24 (Pass Phrase Dialog)
    Some of your private key files are encrypted for security reasons.
    In order to read them you have to provide us with the pass phrases.

    Server analysis.wsos.co.kr:443 (RSA)
    Enter pass phrase:

    Ok: Pass Phrase Dialog successful.
    ./apachectl startssl: httpd started

    [root@smson ssl]# vi pw.sh
    #!/bin/sh
    echo "password"
    [root@smson ssl]# vi /usr/local/apache-ssl/conf/httpd.conf
    <IfModule mod_ssl.c>
    #   Pass Phrase Dialog:
    #   Configure the pass phrase gathering process.
    #   The filtering dialog program (`builtin' is a internal
    #   terminal dialog) has to provide the pass phrase on stdout.
    #SSLPassPhraseDialog  builtin
    SSLPassPhraseDialog  exec:/usr/local/apache-ssl/conf/ssl/pw.sh

     나. 부팅시 자동 시작

     리눅스가 부팅 할때 /etc/rc* 에 있는 파일들을 실행합니다. rc 뒤에 붙은 숫자는 run level을 뜻합니다. 리눅스는 부팅 시에 run level을 지정할 수 있는데 일반적인 작업에서 사용되는 run level은 3입니다. 아래와 같이 간단한 스크립트를 작성하여 링크를 시켜 주시면 됩니다.

    [root@smson bin]# cat apachectlstartssl
    #!/bin/sh
    /usr/local/apache-ssl/bin/apachectl startssl
    [root@smson bin]# cd /etc/rc
    rc          rc1.d       rc3.d       rc5.d       rc.d        rc.sysinit 
    rc0.d       rc2.d       rc4.d       rc6.d       rc.local   
    [root@smson bin]# cd /etc/rc3.d/
    [root@smson rc3.d]# rm -rf S99apache
    [root@smson rc3.d]# ln -s /usr/local/apache-ssl/bin/apachectlstartssl S99apache
    [root@smson rc3.d]# ls -al
    total 12
    drwxr-xr-x    2 root     root         4096 Oct 30 17:50 .
    drwxr-xr-x   10 root     root         4096 Oct 30 17:30 ..
    lrwxrwxrwx    1 root     root           15 Jun 17  2005 K03rhnsd -> ../init.d/rhnsd
    ...
    lrwxrwxrwx    1 root     root           43 Oct 30 17:50 S99apache -> /usr/local/apache-ssl/bin/apachectlstartssl
    lrwxrwxrwx    1 root     root           41 Jun 17  2005 S99mysql -> /usr/local/mysql/share/mysql/mysql.server
    [root@smson rc3.d]#

    Posted by 1010
    98..Etc/Server2008. 12. 1. 11:53
    반응형

    1. 개인키 생성

    개인키 생성

    개인키는 1024bit 로 생성하는 것이 좋습니다. 기본값은 512bit 입니다. 개인키 분실시에는 인증서를 재발급 받아야 하기에 잘 백업해 두어야 한다.


    2. 인증요청서( CSR ) 생성

    CSR( Certificate Signing Request )은 SSL 서버를 운영하는 회사의 정보를 암호화하여 인증기관으로 보내 인증서를 발급받게 하는 일종의 신청서입니다. CSR은 ASCII 텍스트 파일로 생성됩니다. CSR을 생성할 때 서버의 식별명을 입력하게 됩니다.식별명은 각 서버를 공유하게 나타내는 이름으로 다음과 같은 정보를 포함합니다.

    CSR 생성

    주의사항

    • Common Name 에는 인증서를 설치할 사이트의 도메인의 이름을 정확하게 입력하셔야 합니다.
    • Common Name 에는 IP 주소, 포트번호, 경로명, http:// 나 https:// 등은 포함할 수 없습니다.
    • CSR 항목에는 < > ~ ! @ # $ % ^ * / \ ( ) ? 등의 특수 68 문자를 넣을 수 없습니다.
    • CSR 생성 후 서버에 개인키 (Private Key) 가 생성됩니다. 개인키를 삭제하거나 분실할 경우 인증서를 발급 받아도 설치가 불가합니다. 따라서 꼭 개인키를 백업 받아 두셔야 합니다.
    • 정보입력과정 마지막에 나오는 A challenge password 와 An optional company name 두 항목은 입력하지 마시고 Enter 만 누르고 넘어가야 합니다. 두 정보가 입력될 경우 잘못된 CSR 생성될 수 있습니다.


    3. 테스트 인증서 생성 및 웹서버에 설정

    SSL 테스트 인증서

    테스트 인증서를 생성 후 웹서버에 아래와 같이 개인키와 인증서를 설정해 주신 후 재 시작 합니다.

    인증서 설정


    4. 웹브라우저에서 확인

    보안경고

    공인된 인증기관에서 발급되지 않은 인증서의 경우는 사용자가 처음 요청시에 위와 같이 '보안경고' 창을 노출합니다. 브라우저 하단 또는 상단의 열쇠모양의 아이콘을 클릭하여 인증서를 확인 하실 수 있습니다.

    인증서 확인


    5. 인증서 신청 및 발급

    위에서 생성된 CSR 파일을 보면 base64 형식의 내용을 확인 하실 수 있습니다. 이문서의 첫 줄 -----BEGIN … 부터 마지막 줄 -----END … 까지 복사하여 지정된 SSL 접수페이지에 복사하여 붙여 넣은 뒤 입력정보와 함께 전송하면 접수가 완료됩니다.

    대부분의 업체가 이메일을 통해 인증서를 수신하게 되는데, 보통 도메인인증파일과 루트인증파일 두 개를 압축해서 전달합니다.
    인증서를 해당 서버에 저장 후 httpd.conf 파일에 설정해 주시면 됩니다.

    국내구분 외산 국산
    명칭 Comodo TrustSSL thwate VeriSign KICA
    가격 40,000 300,000 240,000 440,000 120,000

    SSL 인증서의 경우 가격이 저렴하다고 해서 SSL 보안서버의 성능이 떨어지거나 신뢰도가 낮은 것은 아닙니다. 가격은 브랜드 인지도, 로열티, 취급수수료에 의해 결정이 됩니다. 도메인 주소가 업체별로 차이가 있는 것과 동일하다고 생각하시면 됩니다. 각 업체별로 다양한 상품이 있는데, 값비싼 상품일수록 책임보험료가 높게 책정되어 있습니다. 문제가 발생 시에 발급기관에서 문제 발생 시에 책정된 보험료를 해당 사이트 사용자에게 보상을 해 주는데, 회원수가 많거나 회원들의 중요정보를 취급하는 경우가 아니고서는 비싼 상품을 선택할 필요는 없습니다.

    내부의 서비스 운영 형태에 따라서 Wildcard 또는 Multi-Domain 인증서를 사용하시면 됩니다.  최근에는 해당 호스팅업체에서도 리셀러 방식의 판매대행을 하고 있고 가격도 더 저렴하기에 현재 서비스를 받고 있는 업체에 문의해 보는 것도 좋은 방법인 것 같습니다.


    6. 인증서 확인

    인증서 확인


    7. 기타

    보안경고

    "보안경고창"은 해당 페이지 소스 내 오브젝트중에 https:// 가 아닌 http:// 로 절대경로가 지정된 것이 있어서 그렇습니다. 이를테면 웹페이지의 이미지 경로를 다른 도메인의 것을 사용했을 때, 해당 요청이 https 아닌 http라서 보안이 안 되는 요청이 있다는 경고창입니다.

    HTTP 암호화

    HTTP 패킷을 보았을 때 관련 정보가 암화화 된 것을 확인 하실 수 있습니다.

    8. 참고

    Posted by 1010
    98..Etc/Server2008. 12. 1. 11:52
    반응형

    보안서버 SSL 

    먼저 Apache와 mod_ssl의 버전을 확인 후에 알맞은 openssl 을 설치해야 합니다. 해당 정보는 www.openssl.org , www.modssl.org 에서 확인 하실 수 있습니다. 알맞는 버전을 확인 후 해당 사이트에 소스를 다운로드 합니다.

    보안서버 SSL

    1. openssl 설치

    [root@smson openssl-0.9.8]# tar xvfz openssl-0.9.8.tar.gz
    [root@smson openssl-0.9.8]# ./config --prefix=/usr/local --openssldir=/usr/local/openssl
    [root@smson openssl-0.9.8]# make; make install
    [root@smson openssl-0.9.8]# ls -al /usr/local/openssl/
    total 36
    drwxr-xr-x    6 root     root         4096 Oct 29 00:08 .
    drwxr-xr-x   24 root     root         4096 Oct 29 00:07 ..
    drwxr-xr-x    2 root     root         4096 Oct 29 00:08 certs
    drwxr-xr-x    6 root     root         4096 Oct 29 00:07 man
    drwxr-xr-x    2 root     root         4096 Oct 29 00:08 misc
    -rw-r--r--    1 root     root         9381 Oct 29 00:08 openssl.cnf
    drwxr-xr-x    2 root     root         4096 Oct 29 00:08 private


    2. mod-ssl 모듈 Apache 소스에 설정

    [root@smson work]# tar xvfz mod_ssl-2.8.24-1.3.33.tar.gz
    [root@smson work]# cd mod_ssl-2.8.24-1.3.33
    [root@smson mod_ssl-2.8.24-1.3.33]# ./configure --with-apache=../apache_1.3.33 --with-ssl=../openssl-0.9.8 --prefix=/usr/local/apache-ssl

    * MaxClients 값을 튜닝하기 위해 아래와 같이 HARD_SERVER_LIMIT 값을 수정한다.
    [root@ihelpers apache_1.3.33]# vi src/include/httpd.h
    #define HARD_SERVER_LIMIT 1024


    3. Apache 설치

    [root@smson apache_1.3.33]# export SSL_BASE=../openssl-0.9.8
    [root@smson apache_1.3.33]# ./configure --prefix=/usr/local/apache-ssl --enable-module=so --enable-rule=SHARED_CORE  --enable-shared=max --enable-module=ssl  --enable-shared=ssl  --enable-module=rewrite  --enable-shared=rewrite  --enable-module=expires  --enable-shared=expires
    [root@smson apache_1.3.33]# make
    [root@smson apache_1.3.33]# make certificate  -- 테스트인증서 생성시 필요(생략해도 큰 문제 없음)
    [root@smson apache_1.3.33]# make install

    보안서버 SSL

    4. 설정

    보안서버 SSL

    보안서버 SSL의 경우는 헤더도 암호화가 되므로 일반적인 웹사이트 설정처럼 443 포트를 공유할 수 없기에, 다른 도메인에 대한 추가 설정 시에는 443 포트가 아닌 다른 포트를 사용해야 합니다. 이와 같은 이유로 많은 도메인에 대한 설정이 필요할 경우는 Wildcard SSL 또는 Multi-Domain SSL 인증서를 고려해 보는 것이 좋습니다.

    아래는 현재 저희가 설정하여 사용하고 있는 설정값 예 입니다.

    [root@smson conf]# vi httpd.conf

    DocumentRoot "/data1/wwwroot/analysis/html"
    ServerName analysis.wsos.co.kr
    ServerAdmin root@smson
    ErrorLog /dev/null
    TransferLog /dev/null
    CustomLog /dev/null common

    SSLPassPhraseDialog  exec:/usr/local/apache-ssl/conf/ssl/pw.sh

    SSLLog      /var/log/ssl_engine_log

    SSLCertificateFile $path/analysis_wsos_co_kr.crt
    SSLCertificateKeyFile $path/analysis_wsos_co_kr.key
    SSLCACertificateFile $path/analysis_wsos_co_kr.ca-bundl



    5. 실행

    보안서버 SSL

    아래와 같이 '-DSSL' 로 SSL 보안서버 모드로 실행된 것을 확인 하실 수 있습니다.  일반 웹서비스는 'start' 옵션으로 실행하시면 됩니다.  실행 시에 비밀번호 자동입력 및 부팅시 자동실행과 같은 내용은 아래 내용을 참고하여 주십시오.

    보안서버 SSL


    6. 참고



    출처 : http://sangmo.tistory.com/132

    Posted by 1010
    98..Etc/Server2008. 12. 1. 11:50
    반응형

    보안서버 구축 가이드- Ver 0.9 - (pdf)

    보안서버 구축 가이드
    - Ver 0.9 -
    2007. 2
    주 의 사 항
    이 가이드의 사용에는 어떠한 제한도 없지만 다음과 같은 사항에 주의하여야 합니다.
    ◦ 문서 내에 언급된 상표, 제품명 등에 대한 권리는 각 상표 또는 제품을 소유한
    해당 기업에 있으며, 설명을 위해 특정 회사 제품명이나 화면이 표시된 경우
    보안서버 구축을 위한 참고자료로써의 고유 목적 외에 어떠한 다른 목적도
    없으며 그렇게 이용되어서도 안됩니다.
    ◦ 문서 내에 기술된 예시 등은 일반 사용자, 기업 등에 있을 수 있는 고유한
    환경을 고려하지 않았으므로 실제 환경에서는 그대로 적용되지 않을 수 있습니다.
    그러므로 각 장에 기술된 내용을 적용할 때에는 먼저 각 사용자, 기업의 고유한
    환경에 적합한지 확인할 필요가 있으며, 내용의 오류로 인해 발생하는 피해에
    대하여 본 가이드의 발행기관은 책임을 지지 않습니다.
    ※ 이 가이드의 내용 중 오류를 발견하였거나 내용에 대한 의견이 있을 때에는
    securekorea@kisa.or.kr로 해당 내용을 보내주시기 바랍니다.
    가이드의 구성
    이 가이드는 사용자들의 이해를 돕기 위하여 다음과 같이 구성되어 있습니다.
    Ⅰ 장과 Ⅱ 장은 사용자들이 반드시 알아야 하는 기본적인 사항들입니다. 꼭 읽어보시고
    각 업체의 환경에 적합한 보안서버를 선택해야 합니다.
    보안서버 구축 방법을 선택하였다면, Ⅲ 장 ~ Ⅴ 장 중 상황에 맞는 내용을 참조하시면 됩니다.
    각 장에 소개되는 설치 방법과 오류시 대처방법을 숙지한 후 보안서버 구축 전문업체에
    연락하시면 보다 자세한 안내를 받을 수 있습니다.
    Ⅵ 장은 보안서버를 구축한 후, 실제 웹페이지에서 수정해야 할 내용에 관한 가이드입니다.
    웹페이지 적용 방법과 실제 사례를 포함하고 있으며, 보안서버가 적용되었는지 확인하는
    방법을 알아보실 수 있습니다.
    Ⅶ 장은 정보통신부에서 추진하고 있는 보안서버 구축 확대에 관한 FAQ를 정리한 것입니다.
    2005년부터 현재까지 웹사이트 운영자들이 자주 질문하신 내용을 정리한 것이므로
    우선 궁금하신 내용이 있는지 확인한 후 추가적인 문의는 보안서버전문협의회 홈페이지
    (www.kisia.or.kr/secureserver)를 참조하거나 securekorea@kisa.or.kr로 문의하시기 바랍니다.
    부록에는 멀티도메인 SSL 인증서와 SSL 가속기에 대한 설명이 포함되어 있습니다.
    목 차 내 용
    Ⅰ. 보안서버란
    - 보안서버의 정의 및 필요성
    - 보안서버 관련 규정
    Ⅱ. 어떻게 시작하지?
    - 보안서버의 종류
    - 전문 구축업체 목록 및 연락처
    Ⅲ. SSL 방식 보안서버 구축하기
    - SSL 방식 보안서버 소개 및 설치방법
    - 오류시 대처방법
    Ⅳ. 응용프로그램 방식 보안서버 구축하기
    - 응용프로그램 방식 소개 및 설치방법
    - 오류시 대처방법
    Ⅴ. 웹호스팅업체의 보안서버 구축하기
    - 웹호스팅서비스 이용자와 제공업체를 위한
    보안서버 구축절차
    Ⅵ. 웹페이지 수정 및 적용 확인하기
    - 웹페이지 적용방법 및 사례
    - 보안서버 적용 확인하는 방법
    Ⅶ. 제도 관련 FAQ - 보안서버 구축 확대 관련 질문과 답변
    부록 - 멀티도메인 SSL 인증서 및 SSL 가속기 소개
    목 차
    Ⅰ. 보안서버 (Secure Server)란 ··························································1
    1. 보안서버의 정의 ·······················································································1
    2. 보안서버 구축의 필요성 ·········································································1
    가. 정보유출 방지(sniffing 방지) ··························································1
    나. 위조사이트 방지(phising 방지) ······················································2
    다. 기업의 신뢰도 향상 ··········································································2
    3. 보안서버 관련 규정 ·················································································3
    Ⅱ. 어떻게 시작하지? ·············································································4
    1. 보안서버의 종류 ·······················································································4
    가. SSL 방식 ·····························································································4
    나. 응용프로그램 방식 ············································································5
    2. 보안서버 구축 전문업체 ·········································································6
    3. 보안서버 구축 절차 흐름도 ···································································7
    Ⅲ. SSL 방식 보안서버 구축하기 ······················································8
    1. 소개 및 인증서 발급 절차 ·····································································8
    가. 개요 ······································································································8
    나. 보안서버 구축 절차 ··········································································9
    2. 설치 과정 ·································································································10
    2.1 IIS 서버에서의 설치 과정 ·······························································10
    가. 개인키 생성 및 CSR 생성 방법 ················································10
    나. SSL 설정 ···························································································16
    2.2 아파치 서버에서의 설치 과정 ························································19
    가. 아파치 서버에 Openssl과 MOD_SSL의 설치 방법 ·················19
    나. 개인키 생성 및 CSR 생성 방법 ··················································21
    다. 인증서 설치 방법 ············································································22
    3. 오류 발생시 대처방법 ···········································································24
    Ⅳ. 응용프로그램 방식 보안서버 구축하기 ··································30
    1. 소개 및 보안서버 구축 절차 ·······························································30
    가. 개요 ····································································································30
    나. 보안서버 구축 절차 ········································································31
    다. 프로토콜 설명 ··················································································33
    2. 설치 과정 ·································································································34
    가. 클라이언트 모듈 설치 ····································································34
    나. 서버 모듈 설치 ················································································35
    다. 사이트 접속 ······················································································36
    3. 오류 발생시 대처방법 ···········································································38
    Ⅴ. 웹호스팅업체의 보안서버 구축하기 ·········································40
    1. 보안서버 구축 절차 ···············································································40
    2. 보안서버 구축 전 확인사항 체크 ·······················································41
    가. 발급 도메인에 대한 정보 확인 ····················································41
    나. CSR 생성 및 보안서버 적용 ························································43
    3. 웹호스팅서비스 제공업체의 고려사항 ···············································43
    가. 서비스 제공 서버에서 개별 인스턴스로 서비스가 가능한지 여부 ····· 43
    나. SSL 보안 포트 서비스 가능 여부 ···············································44
    다. SSL 서비스 가능 여부 ···································································44
    라. 인증서 신청하기 ··············································································45
    4. 보안서버 구축상태 확인 ·······································································46
    Ⅵ. 웹 페이지 수정 및 적용 확인하기 ···········································47
    1. 웹 페이지 수정 방법 및 사례 ·····························································47
    가. 전체 페이지 암호화하기 ································································47
    나. 페이지별 암호화하기 ······································································50
    다. 프레임별 암호화하기 ······································································53
    라. 체크박스를 이용한 선별적 암호화하기 ······································60
    2. 보안서버 적용 확인하기 ·······································································62
    가. 보안서버 적용 확인 방법 ······························································62
    나. 인증서의 암호화 상태 확인 방법 ················································65
    Ⅶ. 제도 관련 FAQ ··············································································69
    부록 A. 멀티도메인 SSL 인증서 소개 ···········································74
    부록 B. SSL 가속기 소개 ···································································84
    그림목차
    <그림 1-1> 보안서버 구축의 필요성 ··························································2
    <그림 2-1> SSL 방식의 보안서버 실행 확인 ·············································5
    <그림 2-2> 응용프로그램 방식의 보안서버 실행 확인 ····························5
    <그림 2-3> 보안서버 구축 절차 흐름도 ······················································7
    <그림 3-1> SSL 방식의 보안서버 개념도 ···················································8
    <그림 3-2> SSL 방식 보안서버 구축 절차 ·················································9
    <그림 3-3> Mod-SSL 설치 확인 예 ····························································20
    <그림 4-1> 응용프로그램 방식 보안서버 구축 절차 ······························31
    <그림 4-2> 서버 플랫폼의 구성 ··································································32
    <그림 4-3> 응용프로그램 방식 프로토콜 ··················································34
    <그림 4-4> 암호화 모듈 설치를 위한 보안경고창 ································36
    <그림 4-5> 암호화 모듈 설치 ······································································37
    <그림 4-6> 암호화 통신 확인 ······································································37
    <그림 5-1> 웹호스팅업체의 보안서버 구축 절차 ····································41
    <그림 5-2> WHOIS를 통한 도메인 정보 확인 ········································42
    <그림 5-3> Mod-SSL 설치 확인 예 ····························································45
    <그림 6-1> 평문 통신을 위한 HTML 소스코드 ······································48
    <그림 6-2> https 프로토콜을 호출하기 위한 HTML 소스코드 ··········· 48
    <그림 6-3> 아파치 서버에서의 Redirection ··············································49
    <그림 6-4> HTML Tag를 이용한 Redirection ·········································49
    <그림 6-5> Javascript를 이용한 Redirection ············································50
    <그림 6-6> 페이지별 암호화 대상 메뉴 ····················································50
    <그림 6-7> 페이지별 암호화 대상 메뉴의 소스코드 ······························51
    <그림 6-8> SSL이 적용된 페이지의 경고창 ·············································51
    <그림 6-9> http 평문 통신 주소가 호출되는 웹페이지의 속성 ···········52
    <그림 6-10> https를 통한 암호화 통신 ·····················································52
    <그림 6-11> http를 통한 평문 통신 ···························································52
    <그림 6-12> 프레임이 포함된 웹페이지 ····················································54
    <그림 6-13> topmenu.htm을 https로 호출하기 ·······································54
    <그림 6-14> topmenu.htm과 main.htm을 https로 호출하기 ················55
    <그림 6-15> 비암호화된 페이지 호출하기 ················································55
    <그림 6-16> HTTP 호출시 80 포트 모니터링 결과 ································56
    <그림 6-17> topmenu.htm만 암호화하여 호출하기 ································56
    <그림 6-18> topmenu.htm의 내용만 암호화된 모니터링 결과 ············57
    <그림 6-19> topmenu.htm과 main.htm을 https로 호출하기 ················58
    <그림 6-20> index.html의 내용만이 모니터링된 결과 ···························58
    <그림 6-21> https를 이용한 호출 ·······························································59
    <그림 6-22> https 호출시 80 포트 모니터링 결과 ·································59
    <그림 6-23> 로그인시 보안접속 체크박스를 이용하기 위한 HTML 소스코드······61
    <그림 6-24> 평문 통신 ··················································································63
    <그림 6-25> 암호화된 통신 ··········································································63
    <그림 6-26> 암호화 통신이 이루어지고 있음을 보여주는 자물쇠 이미지 ····· 64
    <그림 6-27> 보안이 적용된 웹페이지 등록정보 ······································65
    <그림 6-28> 보안이 적용된 웹페이지 접속 ··············································66
    <그림 6-29> 자물쇠 이미지를 통한 암호화 방식 확인 ··························66
    <그림 6-30> 보안이 적용된 웹페이지의 등록정보 중 인증서 버튼 ····· 67
    <그림 6-31> 보안이 적용된 웹페이지의 인증서 기본 정보 확인 ········ 67
    <그림 6-32> 보안이 적용된 웹페이지의 인증서 상세정보 확인 ··········68
    <그림 A-1> 멀티도메인 SSL 인증서의 CN이 있는 도메인과 없는 도메인의 동작····· 76
    <그림 A-2> 암호화 통신이 이루어지고 있음을 보여주는 자물쇠 이미지 ····· 76
    <그림 A-3> 다수의 CN이 포함된 멀티도메인 SSL 인증서 ··················77
    <그림 A-4> 보안이 적용된 웹페이지 속성 확인 ·····································77
    <그림 A-5> 아파치 서버에서 평문 통신을 위한 가상호스팅 설정 ······ 78
    <그림 A-6> 아파치 서버에서 암호화 통신을 위한 가상호스팅 설정 ······· 79
    <그림 A-7> CMD command 실행 모습 ····················································80
    <그림 A-8> IIS 관리자에서 Site Identifier와 Host header 값 확인 ···80
    <그림 A-9> SecureBindings 메타베이스 추가 ··········································81
    <그림 A-10> SecureBindings을 통한 443 포트 공유 ······························81
    <그림 A-11> SecureBindings 제거 ······························································81
    보안서버 구축 가이드 1
    Ⅰ. 보안서버(Secure Server)란
    1. 보안서버의 정의
    보안서버란 인터넷상에서 사용자 PC와 웹 서버 사이에 송수신되는
    개인정보를 암호화하여 전송하는 서버를 의미합니다. 또한 보안서버는
    해당 전자거래 업체의 실존을 증명하여 고객과 웹 서버간의 신뢰를
    형성하고, 웹 브라우저와 웹 서버간에 전송되는 데이터의 암/복호화를
    통하여 보안 채널을 형성합니다.
    인터넷상에서 송․수신되는 개인정보의 대표적인 예로는 로그인시 ID/
    패스워드, 회원가입시 이름/전화번호, 인터넷 뱅킹 이용시 계좌 번호/
    계좌 비밀번호 등이 해당됩니다.
    인터넷 상에서 암호화되지 않은 개인정보는 가로채기 등의 해킹을 통해
    해커에게 쉽게 노출될 수 있으므로, 웹 서버에 보안서버 솔루션을
    설치하면 해커가 중간에 데이터를 가로채도 암호화 되어 있어 개인정보가
    노출되지 않습니다.
    2. 보안서버 구축의 필요성
    가. 정보유출 방지(sniffing 방지)
    학교, PC방, 회사 등의 공용 네트워크를 사용하는 PC에서 보안서버가
    구축되지 않은 사이트로 접속할 경우, 개인정보가 타인에게 노출될
    가능성이 매우 높습니다. 스니핑 툴(sniffing tool)을 사용할 경우
    다른 사람의 개인정보(ID/패스워드/이메일/주민번호/주소/전화번호 등)을
    손쉽게 얻을 수 있습니다. 따라서 보안서버는 개인정보보호를 위해서
    반드시 필요합니다.
    2 보안서버 구축 가이드
    나. 위조사이트 방지(phising 방지)
    보안서버가 구축된 사이트를 이용하여 피싱(phishing) 공격을 시도하기는
    어렵습니다. 따라서 보안서버가 구축된 사이트는 피싱에 의한 피해를
    줄일 뿐만 아니라 고객의 신뢰를 얻을 수 있습니다.
    다. 기업의 신뢰도 향상
    고객의 개인정보를 안전하게 관리하는 기업이라는 이미지를 부각시킬 수
    있습니다. 인터넷상의 암호화되지 않은 개인정보는 가로채기 등의
    해킹을 통해 해커에게 쉽게 유출될 수 있습니다. 암호화된 개인정보는
    해킹을 당해도 보호받을 수 있습니다.
    <그림 1-1> 보안서버 구축의 필요성
    ※ 피싱(Phishing)이란, 개인정보(private data)와 낚시(fishing)를 합성한 조어로써,
    금융기관 등의 웹사이트나 거기서 보내온 메일로 위장하여 개인의 ID 및
    패스워드, 신용카드번호, 계좌정보 등을 빼내 이를 불법적으로 이용하는
    사기수법을 뜻한다.
    보안서버 구축 가이드 3
    3. 보안서버 관련 규정
    보안서버 구축 관련 규정은 아래와 같으며, 전체 법조항이 필요하신 경우는
    정보통신부 홈페이지(www.mic.go.kr)나 법제처 홈페이지(www.moleg.go.kr)를
    참조하시기 바랍니다.
    1. 정보통신망 이용촉진 및 정보보호 등에 관한 법률
    ▶ 제28조(개인정보의 보호조치) 정보통신서비스제공자등은 이용자의 개인정보를 취
    급함에 있어서 개인정보가 분실·도난·누출·변조 또는 훼손되지 아니하도록 정보
    통신부령이 정하는 바에 따라 안전성 확보에 필요한 기술적·관리적 조치를 하여야
    한다. <개정 2004.1.29>
    ▶ 제67조 (과태료) ②다음 각 호의 어느 하나에 해당하는 자는 1천만원 이하의 과태료
    에 처한다. <개정 2004.1.29>
    8의2. 제28조의 규정을 위반하여 기술적·관리적 조치를 하지 아니한 자
    2. 정보통신망 이용촉진 및 정보보호 등에 관한 법률 시행규칙
    ▶ 제3조의2(개인정보의 보호조치) ①법 제28조의 규정에 의한 개인정보의 안전
    성 확보에 필요한 기술적·관리적 조치는 다음 각호와 같다.(중간 생략)
    4. 개인정보를 안전하게 저장·전송할 수 있는 암호화기술 등을 이용한 보안조치
    (이하생략)
    3. 개인정보의 기술적⋅관리적 보호조치 기준
    ▶ 제5조(개인정보의 암호화) ②정보통신서비스제공자등은 정보통신망을 통해 이용자
    의 개인정보 및 인증정보를 송·수신할 때에는 보안서버 구축 등의 조치를 통해
    이를 암호화해야 한다. 보안서버는 다음 각호의 어느 하나의 기능을 갖추어야 한
    다. <개정 2007.1.29>
    1. 웹서버에 SSL(Secure Socket Layer) 인증서를 설치하여 개인정보를 암호화하
    여 송․수신하는 기능
    2. 웹서버에 암호화 응용프로그램을 설치하여 개인정보를 암호화하여 송․수신하
    는 기능
    ③정보통신서비스제공자등은 이용자의 개인정보를 PC에 저장할 때에는 이를 암
    호화해야 한다.
    4 보안서버 구축 가이드
    Ⅱ. 어떻게 시작하지?
    1. 보안서버의 종류
    보안서버는 구축 방식에 따라 크게 「SSL 방식」과 「응용프로그램 방식」
    2가지로 구분할 수 있습니다. 보안서버를 구별하는 방법은 아래와
    같습니다.
    가. SSL 방식
    「SSL 인증서」를 이용한 보안서버는 사용자 컴퓨터에 별도 보안 프로그램
    설치가 필요없으며, 웹 서버에 설치된 「SSL 인증서」를 통해 개인정보를
    암호화하여 전송합니다. 보안서버 구축에 소요되는 비용이 상대적으로
    저렴하지만 주기적으로 인증서 갱신을 위한 비용이 소요됩니다.
    로그인 페이지 등 보안이 필요한 웹페이지에 접속한 상태에서
    브라우저 하단 상태 표시줄에 자물쇠 모양의 마크로 확인할 수 있으며,
    웹사이트의 구성 방법에 따라 자물쇠 모양의 마크가 보이지 않을 수
    있습니다.
    보안서버 구축 가이드 5
    <그림 2-1> SSL 방식의 보안서버 실행 확인
    나. 응용프로그램 방식
    암호화 응용 프로그램을 이용한 보안서버는 웹 서버에 접속하면 사용자
    컴퓨터에 자동으로 보안 프로그램이 설치되고 이를 통해 개인 정보를
    암호화하여 전송합니다.
    웹사이트 접속 시 초기화면이나 로그인 후 윈도우 화면 오른쪽 하단
    작업표시줄 알림영역에 다음 그림과 같은 암호화 프로그램 실행여부를
    확인할 수 있으며, 응용프로그램에 따라 모양은 다르게 나타날 수
    있습니다.
    <그림 2-2> 응용프로그램 방식의 보안서버 실행 확인
    6 보안서버 구축 가이드
    2. 보안서버 구축 전문업체
    보안서버 구축 방법과 절차에 관한 보다 구체적인 내용은 다음의
    「보안서버전문협의회」회원사 중 선택하여 문의하거나 평소 알고 있는
    보안서버 구축 전문업체를 통하여 자세한 설명을 받을 수 있습니다.
    회사명 홈페이지 연락처
    SSL 방식 솔루션 공급 업체
    한국전자인증(주) www.crosscert.com 1588-1314
    한국정보인증(주) www.kica.net (02) 360-3065
    이모션 www.trust1.co.kr (02) 542-1987
    (주)한국무역정보통신 www.tradesign.co.kr (02) 6000-2162
    (주) 한비로 comodossl.co.kr 1544-4755
    (주)닷네임코리아 www.anycert.co.kr 080-456-7770
    나인포유 www.certkorea.co.kr (02) 3444-2750
    (주)아이네임즈 cert.inames.co.kr (02) 559-1006
    응용 프로그램 방식 솔루션 공급 업체
    한국전자인증(주) www.crosscert.com 1588-1314
    이니텍(주) www.initech.com (02) 2140-3553
    한국정보인증(주) www.signgate.com (02) 360-3065
    (주)케이사인 www.ksign.com (02) 564-0182
    드림시큐리티 www.dreamsecurity.com (02) 2233-5533
    시큐리티 테크놀로지(STI) www.stitec.com (02) 558-7391
    펜타시큐리티시스템(주) www.pentasecurity.com (02) 780-7728
    소프트포럼 www.softforum.co.kr (02) 526-8423
    (주)코스콤 www.signkorea.co.kr (02) 767-7224
    엠큐릭스(주) www.mcurix.com (02) 2253-8882
    유넷시스템(주) www.unetsystem.co.kr (02) 390-8000
    보안서버 구축 가이드 7
    ☑ 서버의 운영은 어떻게 하고 계신가요?
    ↓ ↓
    단독 서버 운영 웹호스팅서비스 이용

    ☑ 보안서버 종류와 전문업체를 결정하셨나요? ↓
    ↓ ↓
    Ⅲ.
    SSL 방식
    보안서버 구축하기
    Ⅳ.
    응용프로그램 방식
    보안서버 구축하기
    Ⅴ.
    웹호스팅업체의
    보안서버 구축하기
    웹 서버 기종 확인 구축 절차 확인
    구축 절차 및
    구축 전 확인사항 체크
    ↓ ↓ ↓ ↓
    IIS 서버에서의
    설치 과정
    아파치 서버에서의
    설치 과정
    보안서버 설치 및
    구축 완료
    웹호스팅서비스
    제공업체와의 협의 및
    보안서버 설치
    ↓ ↓ ↓ ↓
    오류시 대처방법 오류시 대처방법 보안서버 구축 확인
    ↓ ↓
    Ⅵ. 웹페이지 수정 및 적용 확인하기
    <그림 2-3> 보안서버 구축 절차 흐름도
    3. 보안서버 구축 절차 흐름도
    지금까지 보안서버의 개념과 종류 등 보안서버를 구축하기 전에
    필요한 사항들을 간단하게나마 알아보았습니다. 이제부터는 본격적으로
    보안서버 구축 방법에 대하여 알아보겠습니다. 현재 기업의 상황을
    확인하시고 아래 절차 흐름도를 참고하여 자신에게 필요한 내용을 찾아
    각 장으로 이동하시면 됩니다.
    8 보안서버 구축 가이드
    Ⅲ. SSL 방식 보안서버 구축하기
    1. 소개 및 보안서버 구축 절차
    가. 개요
    SSL은 Secure Sockets Layer의 머리글이며, 1994년 Netscape에 의해
    전세계적인 표준 보안 기술이 개발되었습니다.
    SSL 방식은 웹 브라우저와 서버간의 통신에서 정보를 암호화함으로써
    도중에 해킹을 통해 정보가 유출되더라도 정보의 내용을 보호할 수 있는
    기능을 갖춘 보안 솔루션으로 전세계적으로 수 백 만개의 웹사이트에서
    사용하고 있습니다.
    아래는 SSL 보안에 대해 그림으로 간단하게 설명해 놓은 것입니다.
    <그림 3-1> SSL 방식의 보안서버 개념도
    인증기관(Certification Authorities)에서 제공하는 SSL 인증서를 발급받아
    웹 서버에 설치하게 되면 웹사이트 이용자들의 거래, ID/패스워드,
    개인정보 등을 암호화하여 송수신할 수 있습니다.
    보안서버 구축 가이드 9
    나. 보안서버 구축 절차
    SSL 방식의 보안서버 구축 절차는 다음과 같습니다.
    서버의 종류 확인
    IIS 서버 / 아파치 서버 등
    ↓ ↓
    2.1
    IIS 서버에서의 설치 과정
    2.2
    아파치 서버에서의 설치 과정
    ...
    ↓ ↓
    개인키 생성 및 CSR 생성 개인키 생성 및 CSR 생성
    ↓ ↓
    SSL 인증서 발급
    인증기관에 CSR 제출 및 인증서 발급 신청

    신청자 상세정보 입력 및 결재
    ↓ ↓
    IIS 서버에 설치 및 SSL 설정 아파치 서버에 설치 및 SSL 설정
    ↓ ↓
    3. 오류 발생시 대처방법
    <그림 3-2> SSL 방식 보안서버 구축 절차
    ① SSL 방식의 보안서버를 사용하기 위해서는 운영하고 있는 웹 서버에
    보안서버 인증서가 설치되어야 합니다. 보안서버 인증서는 운영 중인
    웹 서버에서 '인증서 만들기'를 이용하여 생성합니다.
    ※ 발급이 완료된 인증서는 재발급 또는 변경이 불가능하기 때문에 새로
    발급받으셔야 하며, 새로 발급받을 시 비용이 발생할 수 있으니 CSR
    생성시 절대 주의 바랍니다.
    ② 먼저 운영하는 웹 서버에서 개인키를 만든 후, CSR 파일을 생성하여
    인증기관에 보안서버 인증서 발급을 신청합니다.
    CSR(Certificate Signing Request)이란 인증서 요청파일의 약어로서
    운영하는 URL 및 운영하는 회사의 정보 등이 입력됩니다.
    10 보안서버 구축 가이드
    ③ 인증기관에 CSR을 이용하여 인증서를 신청할 때 회사의 담당자
    정보 등을 입력합니다. 인증서 발급 심사 후에 신청 시 입력한
    담당자의 E-mail 주소로 인증서가 발급됩니다.
    ④ 발급받은 인증서를 운영 중인 웹 서버에 설치하게 되면 SSL 방식의
    보안서버 설정을 완료하게 됩니다.
    서버호스팅 서비스를 받고 있는 고객의 경우에는 서버에 대한 관리자
    권한이 고객에게 있기 때문에 고객이 직접 CSR 생성 및 인증서 발행 후에
    설치를 진행해야 하며, 호스팅 서비스 제공업체에게 보안서버 구축
    대행을 요청하게 되면 설치대행비가 부과될 수 있습니다.
    SSL 방식의 보안서버 구축은 서버의 운영체제에 따라 적용절차가
    모두 다르므로, 가장 많이 사용되는 IIS와 아파치 서버를 중심으로
    설명하겠습니다. IIS 서버에 설치하는 경우는 2.1의 내용을 참고하시고,
    아파치 서버에 설치하는 경우는 2.2의 내용을 참고하시기 바랍니다.
    향후 다른 종류의 서버에 SSL 방식의 보안서버를 설치하는 방법을
    추가해 나갈 예정입니다.
    2. 설치 과정
    2.1 IIS 서버에서의 설치 과정
    가. 개인키 생성 및 CSR 생성 방법
    ① 웹사이트 속성 선택
    시작→프로그램→관리도구→인터넷 서비스 관리자→웹사이트→속성
    보안서버 구축 가이드 11
    ② 등록정보 화면에서 디렉토리 보안을 클릭한 후 서버 인증서를
    클릭합니다.
    ③ 웹 서버 인증서 마법사를 시작합니다. ‘새 인증서를 만듭니다’를
    선택합니다.
    12 보안서버 구축 가이드
    ④ ‘요청을 준비하지만 나중에 보냅니다’를 선택합니다.
    ⑤ 인증서를 만들 이름을 입력하시기 바랍니다.
    이름은 인증서의 별칭이므로 쉬운 것으로 입력하여 주시기 바랍니다.
    인증서 키의 길이는 1,024가 표준입니다. 비트 길이가 너무 크면
    서버에서 인지하지 못할 경우도 있습니다.
    보안서버 구축 가이드 13
    ⑥ 조직 및 조직 구성 단위를 입력합니다.
    조직은 회사의 영문 전체 이름을 입력하고, 조직 구성단위는 영문
    부서명을 입력합니다.(모든 내용은 영문으로 입력합니다)
    ⑦ 인증받을 도메인 이름을 입력하시기 바랍니다.
    14 보안서버 구축 가이드
    ⑧ 지역 정보를 입력합니다.(모든 내용은 영문으로 입력합니다.)
    ⑨ 인증서 요청파일(CSR)을 저장합니다.
    보안서버 구축 가이드 15
    ⑩ 신청한 내용을 다시 한 번 확인합니다.
    ⑪ 인증서 신청을 완료합니다.
    ⑫ CSR 내용을 인증기관에게 메일로 송부하시던지 인증서 신청화면에
    붙여 넣으신 후 인증서 신청을 진행하시면 됩니다.
    자, 이제 인증기관의 발급 절차에 따라서 인증서가 발급됩니다.
    16 보안서버 구축 가이드
    나. SSL 설정
    ① 웹사이트 속성 선택
    시작→프로그램→관리도구→인터넷 서비스 관리자→웹사이트→속성
    ② 등록정보 화면에서 디렉토리 보안을 클릭한 후 서버 인증서를
    클릭합니다.
    보안서버 구축 가이드 17
    ③ 보류중인 요청을 처리합니다.
    ④ 보류 중인 요청 처리-메일을 통하여 받은 인증서(-----begin 부터
    end-----까지)를 저장한 파일을 선택합니다. 인증서 파일을 선택한 후
    다음 버튼을 누릅니다.
    18 보안서버 구축 가이드
    ⑤ 인증서 요약 - 현재 설치하시고자 하는 인증서의 내용이 보여집니다.
    만약에 신청하신 내용과 일치하지 않으면, 경고 메시지가 뜨며,
    인증서가 설치되지 않습니다. 그럴 경우에는 현재의 요청을 삭제하신 후,
    새로운 인증서를 신청하셔야 합니다.
    ⑥ 인증서 설치 후의 설정 - 기본 웹 사이트의 등록정보에서 웹사이트 탭을
    선택합니다. 웹 사이트 확인 섹션에서 고급 버튼을 클릭해서 SSL 포트에
    443을 설정해줍니다.(기본적으로 443을 사용하지만, 사이트 운영자가
    1~65535 범위내에서 임의로 포트번호를 설정할 수 있습니다)
    보안서버 구축 가이드 19
    ⑦ 인증서 설치 확인 - 인증서가 정확히 설치되었는지 인증서가 설치된
    홈페이지를 통해 확인할 수 있습니다.
    https://인증서 신청 URL에 접속해서 하단에 노란자물쇠 버튼이
    뜨는지 확인합니다. 만일 443이 아닌 다른 포트로 SSL 포트를
    적용하였을 경우에는 주소창 뒤에 포트번호를 지정해야 확인할 수
    있습니다.(예 : https://www.kisa.or.kr:442)
    ⑧ 이제 SSL 인증서의 설치가 완료되었습니다. Ⅵ장으로 이동하셔서
    실제 웹페이지를 어떻게 수정해야 하는지 알아보겠습니다.
    2.2 아파치 서버에서의 설치 과정
    가. 아파치 서버에 Openssl과 MOD_SSL의 설치 방법
    아파치 서버에서 SSL 통신을 가능하게 하기 위해서는 OpenSSL과
    mod_ssl이 필요합니다.
    우선, 현재 서비스 중인 Apache 서버에 Mod_SSL이 설치되어 있는지를
    httpd -l 옵션을 사용하여 Mod_SSL.c 또는 Mod_SSL.so가 있는지 확인하시기
    20 보안서버 구축 가이드
    바랍니다. 만일 설치되어 있다면 ‘나. 개인키 생성 및 CSR 생성 방법’ 과정으로
    이동하시기 바랍니다.
    <그림 3-3> Mod-SSL 설치 확인 예
    OpenSSL은 최신버전으로 설치하는 것을 권장하지만 서버의 환경에
    따라서 적합한 버전으로 설치하는 것이 좋습니다. 서버 환경에 맞는
    OpenSSL 버전은 www.openssl.org에서 확인할 수 있습니다.
    또한 Mod_SSL은 반드시 Apache 버전에 맞는 것을 설치하셔야 하며
    www.modssl.org에서 Apache 버전을 확인 한 후 그에 맞는 mod_SSL을
    다운받아 설치하시기 바랍니다.
    ① OpenSSL의 설치(www.openssl.org)
    압축풀기
    $ gzip -cd openssl-0.9.6.tar.gz | tar xvf -
    $ ./config$ make$ make installconfig
    ☞ prefix를 주지 않았을 때에는 /usr/local/ssl 디렉토리에 설
    치가 됩니다.
    다른 디렉토리에 설치를 하고자 한다면 다음과 같이 합니다.
    $ ./config --prefix=/usr/local --openssldir=/usr/local/openssl
    ☞ OpenSSL의 실행파일은 /usr/local/ssl/bin에 설치되고
    인증서비스를 위한 파일들은/usr/local/openssl 아래의
    디렉토리에 생성됩니다.
    보안서버 구축 가이드 21
    ② mod_ssl의 설치 (www.modssl.org)
    압출풀기
    $ gzip -cd apache_1.3.19.tar.gz | tar xvf
    $ gzip -cd mod_ssl-2.8.1-1.3.19.tar.gz | tar xvf
    파일의 다운로드와 압축풀기가 끝나면 mod-ssl 설정을 합니다.
    mod-ssl 설정
    $ cd mod_ssl-2.8.1-1.3.19
    $ ./configure \
    --with-apache=../apache_1.3.19 \
    --with-ssl=../openssl-0.9.6 \
    --prefix=/usr/local/apache
    ③ Apache Server 설치(www.apache.org )
    $ cd ../apache_1.3.x
    $ SSL_BASE=../openssl-0.9.6 \
    ./configure \
    --prefix=/usr/local/apache \
    --enable-module=ssl \
    $ make
    $ make certificate
    $ make install
    나. 개인키 생성 및 CSR 생성 방법
    ① 랜덤 넘버 생성
    $ openssl md5 * > rand.dat
    ② 키 쌍 생성
    $ openssl genrsa -rand rand.dat -des3 -out 1024 > key.pem
    ☞ 개인키 비밀번호를 입력하며 반드시 기억해야 합니다. (암호를
    분실할 경우 SSL 사용을 위한 apache를 구동할 수 없습니다)
    22 보안서버 구축 가이드
    ③ 생성된 키 쌍을 이용하여 CSR생성
    $ openssl req -newkey key.pem > csr.pem
    ☞ 여기서 key.pem은 단계 ②에서 생성한 키 이름이며 csr.pem은
    출력 CSR 파일의 이름입니다.
    다음 정보를 입력하라는 메시지가 나타납니다. (모든 내용은 영문으로
    작성해야 하며, 아래는 입력 예입니다)
    Country(국가 코드) KR
    State/province (시/도의 전체 이름) Seoul
    Locality(시,구,군 등의 이름) Songpa-gu
    Organization(회사 이름) test (이니셜 또는 약자 금지. Full name입력)
    Organization Unit(부서명) : team
    Common Name (host name + domain name) : cert.kisa.or.kr
    "추가 속성"을 입력하라는 메시지가 나타나면 그냥 넘어가셔도 무방합니다.
    ④ CSR 제출
    생성된 CSR(예:csr.pem)의 내용은 다음과 같습니다.
    -----BEGIN CERTIFICATE REQUEST-----
    MIIBETCBvAIBADBXMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEh
    MB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYJKoZIhvcNAQkB
    FgFgMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL6nPTy3avNgbubx+ESmD4LV1LQG
    fcSh8nehEOIxGwmCPlrhTP87PaA0XvGpvRQUjCGStrlQsd8lcYVVkOaytNUCAwEA
    AaAAMA0GCSqGSIb3DQEBBAUAA0EAXcMsa8eXgbG2ZhVyFkRVrI4vT8haN39/QJc9
    BrRh2nOTKgfMcT9h+1Xx0wNRQ9/SIGV1y3+3abNiJmJBWnJ8Bg==
    -----END CERTIFICATE REQUEST-----
    CSR 내용을 인증기관에게 메일로 송부하시던지 인증서 신청화면에
    붙여넣으신 후 인증서 신청을 진행하시면 됩니다.
    인증기관의 발급 절차에 따라서 인증서가 발급됩니다.
    다. 인증서 설치 방법
    보안서버 구축 가이드 23
    ① 메일로 받은 인증서를 복사하여 파일로 저장합니다.(예: Cert.pem)
    -----BEGIN CERTIFICATE-----
    MIIBETCBvAIBADBXMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0Z
    TEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYJKoZIhvcNA
    QkBFgFgMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL6nPTy3avNgbubx+ESmD4LV
    1LQGfcSh8nehEOIxGwmCPlrhTP87PaA0XvGpvRQUjCGStrlQsd8lcYVVkOaytNUCAwE
    AAaAAMA0GCSqGSIb3DQEBBAUAA0EAXcMsa8eXgbG2ZhVyFkRVrI4vT8haN39/QJc9
    BrRh2nOTKgfMcT9h+1Xx0wNRQ9/SIGV1y3+3abNiJmJBWnJ8Bg==
    -----END CERTIFICATE-----
    ② 아파치 서버에 적절한 위치에 저장합니다.
    ③ 환경설정 파일(httpd.conf 또는 ssl.conf)을 수정합니다.
    <VirtualHost _default_:443>
    # General setup for the virtual host
    DocumentRoot /Apache/htdocs
    ServerName @@ServerName@@:443
    ServerAdmin cs@crosscert.com
    ErrorLog logs/error_log
    TransferLog logs/access_log
    SSLCertificateFile /Apache/ssl/cert.pem → 인증서 파일 경로
    SSLCertificateKeyFile /Apache/ssl/key.pem → 개인키 파일 경로
    ④ 아파치를 재구동합니다.
    ./apachectl startssl
    아파치 서버에서 SSL을 사용하기 위한 시작 명령어인 startssl을
    실행하면 개인키의 비밀번호를 묻는데, 이 비밀번호는 이전의
    설치과정 중 ‘나. 개인키 생성 및 CSR 생성 방법’ 중 ② 키 쌍 생성시
    입력한 개인키 비밀번호를 입력하시면 됩니다.
    이제 SSL 인증서의 설치가 완료되었습니다. Ⅵ장으로 이동하셔서
    실제 웹페이지를 어떻게 수정해야 하는지 알아보겠습니다.
    24 보안서버 구축 가이드
    인증서는 저마다 고유한 유효기간을 가지고 있는데, 이 기간이
    지난 인증서를 계속 설치해 두는 경우에 나오는 경고창입니다.
    3. 오류 발생시 대처방법
    ① 인증서를 발급받은 사이트 주소와 실제로 접속한 사이트 주소가 다른 경우
    예를 들어 www.kisa.or.kr로 인증서를 발급받아 설치한 후 실제 적용은
    login.kisa.or.kr로 걸어두는 경우와 같이 인증서를 발급받은
    주소와 실제로 접속한 주소가 다른 경우에 위와 같은 경고창이
    나오게 됩니다.
    ② 인증서가 유효하지 않은 경우
    보안서버 구축 가이드 25
    이 경우는 웹 서버 인증서를 발급한 인증기관을 웹 브라우저가
    인식하지 못하는 경우로써, 브라우저에는 기본적으로 신뢰할 수 있는
    인증기관 리스트가 내장되어 있는데 그 리스트에 없는,
    즉 신뢰할 수 없는 인증기관에서 발급된 인증서를 설치한 경우에
    발생하는 경고창입니다. 실제로는, 웹 서버에서 자체적으로 만든
    인증서를 설치한 경우에 가장 많이 생깁니다.
    말 그대로 보안된 항목 https와 보안되지 않은 항목 http를 모두
    포함하고 있어 나타나는 보안경고창입니다. https://를 이용해서
    암호화 통신을 하고자 하는 페이지의 소스에 http://를 이용하여
    그러나, 보통의 경우 인증서가 설치된 사이트에 접속하는 PC의
    날짜가 잘못되어 있어서 생기는 경우가 가장 많습니다.
    ③ 브라우저가 웹 서버 인증서를 신뢰할 수 없는 경우
    ④ 보안된 항목 https와 보안되지 않은 항목 http를 모두 포함하는 경우
    26 보안서버 구축 가이드
    호출하는 이미지 등이 존재할 때 보안경고창이 나타나는 것입니다.
    이 경우 ‘아니오’ 버튼을 눌러 표시되지 않는 http 항목의 소스를
    절대경로를 써서 https로 호출하시면 됩니다.
    한 페이지 안에 http://와 https://의 두 프로토콜이 존재하기 때문입니다.
    예) HTTP://[로그인 폼 입력 페이지]
    ∇HTTPS://[로그인 서버 처리]
    HTTP://[로그인 완료 페이지]
    예를 들어, http://www.kisa.or.kr에서 https://www.kisa.or.kr
    /login.jsp로 접속할 때 /login.jsp안에 http://www.kisa.or.kr로
    호출하는 직접적인 소스가 있기 때문입니다.
    해결방법 : http://리턴URL을 Script를 통해서 Return URL을
    설정해 주시면 됩니다.
    ⑤ 한 페이지에 http://와 https://의 두 프로토콜이 존재하는 경우
    ⑥ 운영중인 웹 서버를 같은 기종으로 변경하려 합니다.
    개인키와 인증서를 백업하신 후 재설치하여 사용이 가능합니다.
    서버 이전 또는 변경 전 설치 업체에게 반드시 사전 문의 후
    작업을 진행하시기 바랍니다.
    보안서버 구축 가이드 27
    이 에러는 아래와 같은 이유로 발생합니다.
    ⅰ. https 디렉토리에 파일이 존재하지 않을 경우
    ⅱ. 서버의 방화벽이나 end-user의 방화벽에서 443 포트가
    차단되었을 경우
    ⅲ. https 서버가 다운되었을 경우
    ⅳ. SSL Certificate 파일이 정상적이지 않을 경우
    ⅴ. 웹 브라우저에서 ssl 3.0으로 셋팅이 되어 있지 않을 경우
    인증서가 정상적으로 설치되었는지를 확인하시고 서버에서 https를
    위한 포트를 활성화 되었는지 확인하시기 바랍니다. 또한 방화벽과
    L4 스위치 등 보안장비가 있다면 https를 위한 해당 포트를
    모두 허용하여 주시기 바랍니다. IIS 서버의 경우 ‘Netstat –na |
    findstr 포트번호’, 아파치 서버의 경우 ‘Netstat –na | grep
    포트번호' 명령어를 이용하여 https를 위한 포트가 활성화되어
    있는지 확인할 수 있습니다. 위의 모든 내용을 확인한 후에도
    정상적으로 동작하지 않을 경우 해당 업체에게 문의하시기 바랍니다.
    CSR을 생성하실 경우 해당 정보는 모두 영문으로 작성하여
    주셔야 하며 특수문자는 사용하시면 안됩니다. 또한 입력을
    요청하는 모든 내용을 입력하시고 다시 한 번 작업을 하시기 바랍니다.
    위의 모든 내용을 확인 한 후에도 정상적으로 동작하지 않을 경우
    해당 업체에게 문의하시기 바랍니다.
    ⑦ 운영중인 웹 서버 종류를 다른 기종으로 변경하려 합니다.
    개인키와 인증서를 백업하신 후 재설치하여 사용이 가능합니다.
    다만 일부 웹 서버 종류는 인증서 및 개인키의 호환이 안되는 경우가
    있으니 서버 이전 또는 변경 전 설치 업체에게 반드시 사전 문의 후
    작업을 진행하시기 바랍니다.
    ⑧ https로 접속하면 페이지를 표시 할 수 없다는 페이지가 보입니다.
    ⑨ CSR 생성이 정상적으로 되지 않습니다.
    28 보안서버 구축 가이드
    ⑩ 아직 도메인이 없는데 IP를 대상으로 인증서 발급이 가능합니까?
    인증서는 고유의 식별자를 대상으로 발급됩니다. 즉 개인은
    주민등록번호를 기준으로 발급되며 법인은 사업자등록번호로
    발급되고, 서버는 도메인을 기준으로 발급되기 때문에 IP 또는
    서버이름으로는 발급되지 않습니다. 따라서 도메인을 등록하시거나
    서버의 호스트 이름으로 인증서를 신청하셔야 합니다.
    ⑪ 서브(Secondary) 도메인에 대해서도 보안서버를 적용하고 싶습니다.
    어떤 방법이 있을까요?
    일반적인 보안서버 인증서는 Host*Domain 단위로 발급되고
    적용되게 됩니다. 다른 Host*Domain에 대해서도 보안을 적용하고자
    한다면 전문업체와 협의하여 적합한 제품을 구축하셔야
    합니다.
    ⑫ SSL 인증서를 발급 받았는데 도메인의 IP를 변경해도 괜찮은가요?
    인증서는 특정 IP로 제한하여 발급되지 않으며, www.test.co.kr처럼
    도메인 이름으로 발급이 됩니다. 따라서 IP를 변경해도 무관합니다.
    ⑬ 인증서 기간이 만료되어 새로 발급받으려고 하는데 CSR 파일을
    전에 사용하던 것으로 가능한가요?
    보통 웹 서버에서 예전에 사용하던 CSR 파일의 사용이 가능합니다.
    그러나 보안상의 이유로 추천하지 않습니다. 인증서를 갱신하실 때마다
    새로이 CSR 파일을 생성하시는 것이 좋습니다. 또한 웹 서버
    종류마다 반드시 CSR을 생성해야 하는 서버가 있으니 새로
    발급받으시기 전에 전문업체에게 문의하시기 바랍니다.
    보안서버 구축 가이드 29
    ⑭ 보안서버가 구축되었는지 확인을 어떻게 하나요?
    일반적으로 보안서버가 구축되어 있으면 https://URL로 확인이
    가능합니다. 하지만 https://URL을 통해서도 확인이 되지 않는
    경우가 있으니 전문업체에게 확인을 하시면 보다 정확하게 진단을
    받으실 수 있습니다.
    ⑮ 우리가 사용하고 있는 서버에 보안서버 설치가 가능하나요?
    기본적으로 모든 웹 서버에는 인증서 방식의 보안서버가 설치
    가능하지만 서버 환경에 따라서 별도의 작업이 필요할 수도 있습니다.
    보안서버 신청 및 설치 전에 전문업체에게 문의하신 후 작업을
    진행하시기 바랍니다.
    반드시 확인이 필요한 서버는 Apache, Tomcat 등이 있습니다.
    출처 : http://jinjin707.tistory.com/117
    Posted by 1010
    01.JAVA/Java2008. 11. 28. 17:32
    반응형

    Extract All Classes Loaded in the JVM into a Single JAR

    Today I needed to optimize the file size for a commercial Java applet (Web form signer) that my team is developing in the last month. We use few external libraries (Bouncy Castle Crypto API and few others) and these libraries are above 2 MB in several JAR files. If we were developing server side application, it would not be a problem, but when we are building an applet, the size of the applet and all its JARs matters.

    I needed to remove all unused classes from the JARs that my applet was including a part of itself. For example the Bouncy Castle JARs were about 1,6 MB but the applet used only a small part of all algorithms and standards implemented by these JARs.

    Extracting All Classes Loaded in the JVM

    My final goal was not only to remove all unused classes from all JAR files but also merge these JARs along with the applet classes into a single JAR file that has the smallest possible size. I came with the idea to run the applet, to go through all its functionality and to get a list of all classes currently loaded into the JVM executing the applet. At this moment all classes required by the applet for its normal work will be loaded in the JVM and all classes that was never used by the applet will not be loaded in the JVM. If I package all these classes into a new JARs, it will contain the minimal set of classes nedded by the applet along with the applet classes.

    As fas as I know how the JVM and the class loaders behave, this should be correct - we can expect all classes required by the applet to be loaded in the JVM after its entire functionality is accessed at least once.

    I had a serious problem: how to get a list of all classes loaded in the JVM.

    List All Classes Loaded in the JVM

    Geting a list of all classes that are loaded in the JVM at some moment is not easy job. We can write Java agent through the java.lang.instrument API but I needed to do this at runtime (just to add few lines to the applet). I found in Google a very nice class for accessing all classes loaded in the JVM written by Vladimir Roubtsov and published in Java World (http://www.javaworld.com/javaworld/javaqa/2003-07/01-qa-0711-classsrc.html). With few modifications it successfully listed all classes loaded in my applet.

    Create a Single JAR with All Classes Loaded in the JVM

    The next step was to create a single JAR with all classes loaded in the JVM. This was not complex. I created a class with few methods for copying all currently loaded classes into some directory specified as parameter. Here is the source code:

    1. import java.io.File;  
    2. import java.io.FileOutputStream;  
    3. import java.io.IOException;  
    4. import java.io.InputStream;  
    5. import java.io.OutputStream;  
    6. import java.net.URL;  
    7.  
    8. /***  
    9.  * This class extracts all classes loaded in the JVM and their binary contents  
    10.  * (.class files) into given directory so that you can create JAR archive later.  
    11.  * @author Svetlin Nakov - http://www.nakov.com  
    12.  */ 
    13. public class AllClassesInJVMExtractor {  
    14.  
    15.     private final static int BUFFER_SIZE = 4096;  
    16.  
    17.     public static void extractAllClassesFromJVM(String destFolder)  
    18.             throws IOException {  
    19.         ClassLoader appLoader = ClassLoader.getSystemClassLoader();  
    20.         ClassLoader currentLoader = AllClassesInJVMExtractor.class.getClassLoader();  
    21.  
    22.         ClassLoader[] loaders = new ClassLoader[] { appLoader, currentLoader };  
    23.         final Class< ?>[] classes = ClassScope.getLoadedClasses(loaders);  
    24.         for (Class< ?> cls : classes) {  
    25.             String className = cls.getName();  
    26.             URL classLocation = ClassScope.getClassLocation(cls);  
    27.             System.out.println("Extracting class: " + className + " from " +   
    28.                     classLocation);  
    29.             String destFileName = destFolder + "/" 
    30.                     + className.replace(".", "/") + ".class";  
    31.             copyFile(classLocation, destFileName);  
    32.         }  
    33.     }  
    34.  
    35.     private static void copyFile(URL sourceURL, String destFileName)  
    36.             throws IOException {  
    37.         File destFile = new File(destFileName);  
    38.         File destDirectory = destFile.getParentFile();  
    39.         destDirectory.mkdirs();  
    40.         InputStream srcStream = sourceURL.openStream();  
    41.         try {  
    42.             OutputStream destStream = new FileOutputStream(destFile);  
    43.             try {  
    44.                 copyStreams(srcStream, destStream);  
    45.             } finally {  
    46.                 destStream.close();  
    47.             }  
    48.         } finally {  
    49.             srcStream.close();  
    50.         }  
    51.     }  
    52.  
    53.     private static void copyStreams(InputStream srcStream,  
    54.             OutputStream destStream) throws IOException {  
    55.         byte[] buf = new byte[BUFFER_SIZE];  
    56.         while (true) {  
    57.             int bytesRead = srcStream.read(buf);  
    58.             if (bytesRead == -1) {  
    59.                 // End of stream reached  
    60.                 return;  
    61.             }  
    62.             destStream.write(buf, 0, bytesRead);  
    63.         }  
    64.     }  
    65.  
    66. }  
    67.  

    It is not a rocket science. I go through all classes loaded by the current class loader and by the system class loader, get their fully qualified name (e.g. org.bouncycastle.cms.CMSSignedData) and their source URL location (e.g. jar:file:/C:/PROJECTS/GeneratePKCS7andVerify/lib/bcmail-jdk15-140.zip!/org/bouncycastle/cms/CMSSignedData.class) and I copy their binary contents (from the URL) to the destination folder (into a .class file). In the mean time I recreate the package structure (following the full class name with all its packages). Finally I get a directory containing all class files loaded in the JVM at the time of caling my method and I can manually package them in a JAR (removing beforehand all system Java classes). That’s all. I use slightly modified version of ClassScope.java.

    You can download a fully functional example here (Eclipse project): ExtractAllClassesFromJVMIntoJAR.zip.

    Posted by nakov in java, blog

    Comments are closed.

    Posted by 1010
    91..개발관련프로그램2008. 11. 28. 17:29
    반응형
     Web Development Library  ActiveX
     개발 언어  Java, JSP, HTML, Javascript  C++, Visual Basic, etc.
     클라이언트에 설치되는 프로그램  없음  ActiveX 설치 (처음 1회 설치)
     보안 인증  필요 없음  설치할때 1회 필요
     데이터베이스 처리  JDBC  Database Connection을 위한 별도의 Ajax request/reponse
     소스코드 공개여부  모든 소스코드 공개  대부분의 Control은 소스코드 공개 안함
     사용자가 기능을 쉽게 확장할 수 있는지 여부  WDL control java class에서 inheritance를 받은 class를 정의하여 overriding을 하면 사용자가 원하는 기능을 확장 할 수 있음  ActiveX가 제공하는 API 이외에는 개발자가 재정의 할 수 없음
     처리 속도  IE의 HTML 처리 속도, ActiveX보다는 화면 처리 속도가 느릴 수 있음  Windows의 처리속도, 빠름


    http://www.webdevlib.net/wdl/doc/index.jsp
    http://www.webdevlib.net/wdl/doc/index.jsp
    http://www.webdevlib.net/wdl/doc/index.jsp
    Posted by 1010
    98..Etc/Etc...2008. 11. 28. 17:23
    반응형

    Not Clickjacking (Almost Certainly)

    [UPDATE: See updated post]

    A couple months back, I got to thinking about how to weasel around the built-in pop up blockers for Mozilla Firefox and Microsoft Internet Explorer. I can't remember now why I started down this path, but it consumed my afternoon, and in the end I had about a dozen variations on three or so core strategies.

    Since I have no fake watches or mortgages to sell, I thusly shelved it all once I was done. We couldn't think of a reasonable application for these techniques here in BreakingPoint.

    Well, maybe something was in the air, because it looks like RSnake and Jeremiah Grossman were working on something similar at around the same time. Only, they were going to present their findings at OWASP this week.

    Unfortunately, we can't know what the extent of their trickery is, since some vendors asked them to keep it quiet -- but it's almost certainly more devious than simply skipping around the pop up blockers.

    So, in the interest of quelling any speculation on the nature of "ClickJacking," here's two or three mildly interesting examples of what it almost certainly isn't. Note, the below example links are all in an iframe from planb-security.net. So, if you have a tabbed browser, you may notice an illusion the iframe's parent window (this blog post) being replaced by the fake pop up link (in this case, example.com).



    If you're in the business of speculating on what other people's findings are, then you can safely check these techniques off your list. Since they all require Javascript to work their anti-anti-pop up magic, NoScript is quite effective in preventing these attacks. Based simply on this observation, and discounting for the moment the inherent lameness of merely subverting mouse clicks, it's virtually certain Jeremiah and RSnake's stuff is much, much more interesting / dangerous.

    Posted by Tod Beardsley (2008/09/25 16:13:37.133 GMT-5)
    5 comments | Tags:

    Hmm

    작성자 Lawrence D'Oliveiro 작성 시각 2008-09-26 00:21
    Your second example doesn't seem to work for me. I think you need a "return false" after the form-submit statement.

    Also they've said that the exploit has to do with dynamic HTML. That means it would have to involve dynamically adding/modifying things in the DOM for the Web page.

    Just an observation

    작성자 Internet Junkie 작성 시각 2008-09-26 00:21
    i used opera and instead of directly clickinn the on links , right clicked and selected open in a new tab.
    Your demo exploit failed to work.
    Please give it a try.

    Regards.

    Not quite so, Opera suffers too

    작성자 Rhian 작성 시각 2008-10-06 02:22
    Right-clicking can get you anywhere...

    By default Opera is affected like FF and IE. So it's not the demo at fault, you just circumvent the default behaviour.

    If you click here.... means you left-click on it, not clicking somewhere else or right-clicking the link.

    I'm not bashing Opera, I'm using it myself too, but just the really stupid remark.

    It is as if someone (or a GPS) says go right at the end of the street then you'll reach such-and-such. Internet Junkie claiming: If I go left I don't get there. The GPS is faulty/the preson giving directions is wrong.
    It's as simple and as stupid as that.

    not very new

    작성자 Franky Van Liedekerke 작성 시각 2008-09-26 03:26
    Not to be a critic here, but the onmouseup, onmousedown and other onmouse events are all old thingies. These examples do nothing new here. Fun would be also onmouseover and onmouseout, but again: nothing new. Disable javascript and these so-called issues don't work anymore. But people might object to javascript-disabling since ajax-sites love using this as well.

    Franky

    speculating clickjacking

    작성자 pokemon123 작성 시각 2008-10-05 03:50


    Here is my speculation on what clickjacking is.
    There are two parts. The first part: Hovering an invisible button so users can inadvertently click it without realizing it. The second part, executing a malicious script. The second part appears easy. It is probably just like onMousedown jacking or something like that.
    The first part: hovering an invisible button. Where have I seen this before. Yes, the patched Adobe PDF. In 2006-2007, Di Paolo and Fedon disclosed the universal XSS attack. In particular, easy demos were widely circulated that injects a javascript, any javascript, to a PDF file. The attack was so powerful, Adobe patched it within a month. After the Adobe patch, the use experience of Acorbat reader changed as follows: When clicking a link inside the Acrobat Reader while reading a PDF document, a prompt box pops us to ask the user whether that link is to be fetched or not. That link, inside Adobe Acrobat Reader, is invisible or at least semi-invisible.
    So here is my speculation on what clickjacking is. I speculate the RSnake and Grossman figured out how to transplant the invisible button in Acrobat to ordinary Javascript, and used it to create clickjacking. It is probably a semi-invisible button, or fully invisible button, much like the links in Acrobat. Also, RSnake and Grossman probably figured out how to suppress the pop-up warning in Acrobat. If they know how to transplant it, they probably also know how to suppress the pop-up warning.
    Experts out there are better judges of whether my speculation is way off the mark. Those with expertise on the UXSS attack and the corresponding Adobe patch can follow the tip better than I ever can.
    Have you noticed Adobe is closely working on patching clickjacking, while browsers are not. This is despite the claim by RSnake and Grossman that browsers should be the main party to patch it. I wonder why?

    Posted by 1010
    98..Etc/Etc...2008. 11. 28. 17:16
    반응형

    전혀 쓸모 없을 것 같은 팁이지만 가끔 쓰는 경우가 있어서 정리해 둡니다.

    실행 -> cmd -> diskpart를 칩니다.

    1. LIST VOLUME[엔터]

    이렇게 하면 현재 컴퓨터에 존재하는 선택할 수 있는 VOLUME을 확인할 수 있습니다.

    2. SELECT VOLUME 번호[엔터]

    특정 볼륨을 선택합니다.

    3. ASSIGN LETTER 원하는 드라이브명[엔터]

    이제 드라이브 명이 변경됩니다.

    예)

    LIST VOLUME[엔터]

    SELECT VOLUME 1[엔터]

    ASSIGN LETTER D[엔터]

    결과)

    1번 볼륨이 D:로 변경됨


    출처 : http://okjsp.pe.kr/seq/126791

    Posted by 1010
    반응형






    ScriptX-lovzip.zip


      패치후 scriptX 에러 수정하기


     


    ' http://www.meadroid.com의 ScriptX 공개 프린트 컴포넌트로 상당히 많은 기능이 있으나
    무료로 사용할수 있은 기능은 아래와 같고.  그 외의 기능은 라이센스가 필요하다.


     






    <script language="javascript">


    function printWindow() {
       factory.printing.header = "머릿글" //머릿말 설정
       factory.printing.footer = "바닥글"   //꼬릿말 설정
       factory.printing.portrait = true                    //출력방향 설정: true-가로, false-세로
       factory.printing.leftMargin = 1.0                 //왼쪽 여백 설정
       factory.printing.topMargin = 1.0                 //왼쪽 여백 설정
       factory.printing.rightMargin = 1.0               //왼쪽 여백 설정
       factory.printing.bottomMargin = 1.0            //왼쪽 여백 설정
      factory.printing.Print(false, window)
    }
    </script>


     



    <object id="factory" viewastext  style="display:none"
      classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
      codebase="http://www.meadroid.com/scriptx/ScriptX.cab#Version=6,2,433,14">
    </object>



     


    <input type="button" name="print" value="프린트" onClick="printWindow();">


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


     


    - 프린터 팁 : 웹페이지를 다음 페이지에 인쇄


         <p style="page-break-before:always">
         이 태그를 만나면 다음페이지에 인쇄함.

    Posted by 1010
    02.Oracle/DataBase2008. 11. 28. 17:11
    반응형

    예 kfm08ot1이라는 테이블의 bnk_cd ='04' 인 데이터를 실수로 삭제를 했다.

    commit; 도 완료된 상태라면..


    앞이 막막할것이다.

    이럴땐 이렇게 데이터를 불러보자..


    SELECT * FROM KFM08OT1
     as of timestamp ( systimestamp - interval '10' minute)
    where bnk_cd = '04'
    조회후  파일을 txt나 엑셀로 저장후..

    다시 임포트 해야 합니다.


    아래와같은 방법으로 해보니 된다....ㅋㅋ 엑셀로 임포트 작업안해도됨!!

    INSERT INTO EMP (SELECT *
            FROM EMP
         AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '1' MINUTE))



    출처 : http://okjsp.pe.kr/seq/99832
    Posted by 1010
    02.Oracle/DataBase2008. 11. 28. 17:03
    반응형

    1) 에디터 플러스 에서 블럭 지정후 ctrl + H 키로 바꾸기 선택

    2) 정규식 체크(확장)

    3) 찾을말 (.*) : 모든 문자열을 찾는다

    4) sql.append("\1"); : ""안에 \1은 현재 문자열 상태

    5) 모두바꿈...

    Posted by 1010
    02.Oracle/DataBase2008. 11. 28. 17:02
    반응형
    sourceforge.net에서 JDBC를 사용하는 모든 어플리케이션의 간단한 설정으로 소스의 변경없이 모든 Database의 Transaction에 대한
    SQL을 parameter matched된 로그를 보여주는 lib가 있네요...
    개발시 개발성능향상에 많은 도움이 될것같습니다.
    http://log4sql.sourceforge.net 에 가보면 한글/영문 메뉴얼이 다 있군요.
    아래는 링크와 해당 lib에대한 내용입니다.

    In develope we use many framework and tools.
    Developer's important work is developing PL/SQL.
    Many tools and Framework support All Layers.
    View, Model, and Controller or DataAcess Layer... so developer can concentrate business logic. And i think business logics is PL/SQL.
    All PL/SQL works repeat Make query And executioning And debugging.
    In that case we can use jdbc or Connection Pooling(Apache DBCP) or support 2PC (JTA,JOTM) and etc...
    In many case Also we use ORM(Object Relation Mapping) ibatis or springJDBC or hibernate...
    Then problem occurs "My Query How to Works! And Parameters are correct?"
    I'm sure log4sql is easy And simple Configuration change But Very Usefull for you!

    You can download log4sql from here(http://sourceforge.net/project/showfiles.php?group_id=209296 )log4sql Sourceforge.net



    출처 : http://okjsp.pe.kr/seq/106707
    Posted by 1010
    02.Oracle/DataBase2008. 11. 28. 17:00
    반응형
    select x.*, CEIL((x.D_DIFF + x.DAYOFWEEK)/7)||'주' week_name
    from (
    select sdate,TO_CHAR(TO_DATE(SUBSTR(to_char(sdate,'yyyymmdd'), 1, 6) || '01', 'YYYYMMDD'), 'D') - 1 AS DAYOFWEEK,
    TO_NUMBER(to_char(sdate,'yyyymmdd')) - TO_NUMBER(SUBSTR(to_char(sdate,'yyyymmdd'), 1, 6) || '01') AS D_DIFF
    from (
     select sysdate + b.rnum as sdate
     from dual, (select rownum rnum
        from   user_tables
        where rownum <=30) b
      )
    ) x


    출처 : http://okjsp.pe.kr/seq/107699
    Posted by 1010
    반응형

    <html>
     <title>동적 테이블</title>
    <head>
    <style>
     table {
      border:  solid 1px;
     }
     th {
      background:  orange;
      border:  solid 1px;
     }
     td {
      border:  solid 1px;
     }
     table#t {
      width:  500px;
      height:  300px;
     }
    </style>
    <script>
    function TableController(){}
    TableController.prototype = {
     setId : function(aId) {
      this.id = aId;
      this.element = document.getElementById(aId);
      this.tbody = this.element.getElementsByTagName("TBODY")[0];
     },
     getRows : function() {
      return this.tbody.getElementsByTagName("TR");
     },
     getHeaders : function() {
      return this.getRows()[0].getElementsByTagName("TH");
     },
     getCols : function(index) {
      return this.getRows()[index].getElementsByTagName("TD");
     },
     makeCol : function() {
      var aCol = document.createElement("TD");
      var bindACol = aCol;
      var bindThis = this;
      aCol.onmouseover = function() {
       bindACol.style.background = "red";
      };
      aCol.onmouseout = function() {
       bindACol.style.background = "white";
      };
      aCol.onclick = function() {
       bindThis.merge(bindACol);
      };
      return aCol;
     },
     merge : function(target) {
      var parent = target.parentNode;
      var adjacent = target.nextSibling || target.previousSibling;
      parent.removeChild(target);
      adjacent.colSpan = 2;
     },
     addRow : function() {
      var aRow = document.createElement("TR");
      var colLength = this.getHeaders(1).length;
      var aCol;
      for(var i=0; i<colLength; ++i) {
       aCol = this.makeCol();
       aCol.appendChild(document.createTextNode("Column "+(i+1)));
       aRow.appendChild(aCol);
      }
      this.tbody.appendChild(aRow);
     },
     removeRow : function() {
      var rows = this.getRows();
      var rowLength = rows.length;
      if(rowLength == 1) {
       alert("헤더는 삭제할 수 없습니다.");
       return;
      }
      this.tbody.removeChild(rows[rowLength-1]);

     },
     addCol : function() {
      var colLength = this.getHeaders(1).length;
      var rows = this.getRows();
      var rowLength = rows.length;
      var headers = this.getHeaders();
      var headerLength = headers.length;
      var aHead = document.createElement("TH");
      aHead.appendChild(document.createTextNode("헤더 "+ ++headerLength));
      rows[0].appendChild(aHead);
      var aCol;
      for(var i=1;i<rowLength; ++i) {
       aCol = this.makeCol();
       aCol.appendChild(document.createTextNode("Column "+(colLength+1)));
       rows[i].appendChild(aCol);
      }
     },
     removeCol : function() {
      var colLength = this.getHeaders(1).length;
      if(colLength == 1) {
       alert("헤더는 삭제할 수 없습니다.");
       return;
      }
      var rows = this.getRows();
      var rowLength = rows.length;
      var aCol = rows[0].getElementsByTagName("TH")[colLength-1];
      rows[0].removeChild(aCol);
      for(var i=1; i<rowLength; ++i) {
       aCol = rows[i].getElementsByTagName("TD")[colLength-1];
       rows[i].removeChild(aCol);
      }
     }
    }

    var tController;
    window.onload = function() {
     tController = new TableController();
     tController.setId("t");
    }
    </script>
    </head>
    <body><center>

    <form>
    <input type="button" value="row추가" onclick="tController.addRow();">
    <input type="button" value="row삭제" onclick="tController.removeRow();">
    <input type="button" value="cols추가" onclick="tController.addCol();">
    <input type="button" value="cols삭제" onclick="tController.removeCol();">
    </form>

    <table id="t">
     <tr>
      <th>헤더 1</th>
      <th>헤더 2</th>
     </tr>
    </table>
    </body>
    </html>



    출처 : http://okjsp.pe.kr/seq/115690

    Posted by 1010
    반응형
    해야 할 것은 날짜 별로 검색한 결과를 바로 엑셀로 다운 받는 것..

    땅파기...........No 1.

    원래 보여지는 화면과 다르게 엑셀로 받기를 누르면 정보를 DB 에서 가져와서 그 정보를 내려받아야 하기 때문에 처음에는 서블릿 단에서 해야 하겠구나..하고 첫번째 땅파기 시작...

    찾아보니 jxl 이라는 Java Excel API 가  있어서 사용해보았다.

    소스보기


    엑셀로 저장이 된다.. 하지만 문제는? 저장하기 창이 나오지 않고 정한 위치에 그대로 그냥 저장이 되어버린다는 거... 저장하는 위치를 어떻게 정하지라는 생각을 하게 만들었고 그럼 받는 창 또한 만들어야 하나?;; 하다보니 또 다른 문제점 발생..

    서버에 올리면.......서버에 파일이 존재한다는 거...나 지금 뭐한거지 라는 생각에 빠져버림...
    서버에 올려진 파일을 받을라면 클라이언트? 소켓 별별 생각이 꼬리를 물고 늘어졌다...이건 아닌거 같은데 하고 과감하게 접기..


    땅파기...........No 2.

    자바 스크립트에서 하는 방식이 있을 텐데 하는 생각에 검색해보니 역시나 존재...자..이제 두번째 삽질의 시작...

    첫번 째보다는 간단해진 방식이지만 미리 버튼을 눌렀을 때 그 데이터가 html 상에 뿌려져있어야 한다. 따라서 파일을 뿌려주는 부분 을 새창으로 띄어서 거기서 데이터가 보인 후 내려받기 버튼을 통해 받을 수 있도록 생각해보았다.

    소스보기


    실행해보니 잘되었다. 이제 끝났나 했지만..문제는 약간 있었음..IE 에서만 돌아간다는...그렇지만 일단 되니까 라고 생각해지만..
    IE 7.0 에서도 안되었다. .execCommand('SaveAs' ~~ )  이부분이 7.0에서는 다운로드 창을 못 띄우는 것...처음에 테스트 해본 노트북은 비스타였으니....이렇게 브라우져에 영향 받으면 안되는데..하면서 다른 방법 을 모색 함...


    땅파기...........No 3.

    제일 간단하고 쉬운 방법...
    response 에 excel 로 받겠다고 정보를 끼워넣으면 html 에서 열었을 때 자동으로 내려받기로 뜨게 된다.
    왜 처음부터 이렇게 생각 안했을까! 이런 방식이 있다고 알고 있긴 했지만 처음 생각은 html 에서 뿌려주지 않고 서블릿 단에서 바로 받기를 원했기 때문이었다.... 정말 길게 돌아와버렸다...

    response.setHeader("Content-Disposition", "attachment; filename="+fileName);
    response.setHeader("Content-Description", "JSP Generated Data");


    * IE 5.5 에서는..아래와 같이 써야 한다고 한다.
    response.setHeader("Content-Disposition", "inline; filename=myfile.xls");
    response.setHeader("Content-Description", "JSP Generated Data");

    생각 좀 하고 짜보자..서버로 받으면 어쩌겠다는 건지..그리고 먼저 사용가능한 환경부터 생각해보고 구현해보자..
    삽질 좀 그만 해보자..
    Posted by 1010
    98..Etc/C2008. 11. 28. 00:46
    반응형
    http://www.microsoft.com/korea/seminar/
    Posted by 1010
    98..Etc/Server2008. 11. 27. 13:17
    반응형

    Apache 웹서버에 SSL를 적용하기 위해 아래 두 항목이 웹서버에 설치되어 있어야 합니다.

    - Openssl 암호화 라이브러리
    - Mod_ssl 모듈

    위 두 항목이 웹서버에 설치되어 있다면 개인키를 생성하고 생성된 개인키를 바탕으로 CSR 파일을 생성합니다.
    생성된 CSR 파일을 한비로에 접수하여 정식 인증서를 발급받습니다.
    발급된 인증서를 웹서버에 설치하게 되면 SSL 설정을 완료하게 됩니다.

    위 일련의 진행사항은 아래와 같은 절차를 따르게 됩니다.

    1. openssl 라이브러리 설치상태 확인
    2. mod_ssl 모듈 설치상태 확인
    3. 개인키 생성
    4. CSR 생성
    5. 한비로에 접수
    6. 정식 인증서 발급
    7. SSL 설정
    사용자 삽입 이미지


    1. Openssl 라이브러리 설치상태 확인

    먼저 SSL를 설치하고자 하는 웹서버에 openssl 라이브러리 설치상태를 find 명령어를 활용하여 아래와 같이 확인합니다.
    사용자 삽입 이미지
    위와 같은 값을 보인다면 openssl 라이브러리 모듈은 rpm으로 설치된것입니다.
    만약에 경로가 /usr/local 아래 있다면 모듈은 소스로 설치된 것입니다.
    rpm으로 설치된 것이라면 rpm -qa 명령어를 사용하여 openssl-devel 설치여부도 함께 점검합니다. 버전에 따라 라이브러리 버전이 아래보이는 값과 차이가 있을수 있습니다.

    사용자 삽입 이미지
    Openssl 은 암호화 처리를 위한 독립 모듈로 최신버젼으로 설치하는 것을 권장합니다.


    2. Mod-ssl Openssl 라이브러리 설치상태 확인

    Openssl 과 마찬가지로 웹서버의 mod_ssl 설치여부를 점검합니다.
    Apache 웹서버는 두가지 방식으로 모듈설치를 지원하고 있습니다. 정적과 동적인 방식으로 정적으로 설치된 경우는 아파치의 재설치까지 요구되며 동적인 경우는 손쉽게 모듈 설치가 가능합니다.
    Apache 가 /usr/local 아래 설치된 것을 기준으로 아래와 같은 방식으로 확인합니다.

    정적으로 설치된 mod_ssl 모듈확인
    사용자 삽입 이미지

    동적으로 설치된 mod_ssl 모듈확인
    사용자 삽입 이미지

    웹서버에 설치된 모듈중 mod_so.c 를 먼저 확인후 동적으로 설치된 모듈중 mod_ssl.so 를 확인합니다.
    동적으로 설치된 경우 apache 설치 디렉토리의 module 이나 libexec 디렉토리내에 mod_ssl.so 의 존재여부를 확인합니다.


    3. 개인키 생성

    Openssl 명령어를 이용하여 웹서버의 RSA키( 1024비트 암호화 )를 생성합니다. ( sslhanbiro.key 는 임의로 지정된 키값입니다. 원하는 이름으로 키를 생성합니다. )
    패스워드를 지정하게 됩니다. 이때 입력된 패스워드는 차후 여러차례 사용되므로 본인만이 알 수 있는 패스워드로 지정해 주시는 것이 좋습니다.
    사용자 삽입 이미지
    이때 생성되는 개인키는 반드시 백업을 받아놓고 사용하는 것이 좋습니다.
    생성된 키는 아래와 같이 확인이 가능합니다. 패스워드를 확인 하는데 이때는 키생성시 입력한 패스워드를 입력합니다.
    개인키 생성까지 완료되면 이제 CSR 생성을 하게됩니다.
    사용자 삽입 이미지


    4. 인증요청서( CSR ) 생성

    *발급이 완료된 인증서는 재발급 또는 변경이 불가하므로 CSR 생성시 절대 주의 바랍니다.

    ☞ CSR ( Certificate Signing Request ) 이란?


    SSL 서버를 운영하는 회사의 정보를 암호화하여 인증기관으로 보내 인증서를 발급받게 하는 일종의 신청서입니다.
    CSR은 ASCII 텍스트 화일로 생성됩니다.
    CSR을 생성할 때 서버의 식별명을 입력하게 됩니다. 식별명은 각 서버를 공유하게 나타내는 이름으로 다음과 같은 정보를 포함합니다.

    Country Name ( 국가코드) [] : KR
    State or Province Name ( 지역 ) [] : Seoul
    Locality Name ( 시/군/구 ) [] : Seocho
    Organization Name ( 회사명 ) [] : Hanbiro Inc
    Organizational Unit Name ( 부서명 ) [] : Linux Team
    Common Name ( 서비스도메인명 ) [] : www.hanbiro.com
    Email Address [] : hanbiro@hanbiro.com

    ☞ CSR 항목에 대한 설명

    Country Name : 이것은 두 자로 된 ISO 형식의 국가 코드입니다.
    State or Province Name : 시 이름을 입력해야 하며 약어를 사용할 수 없습니다.
    Locality Name : 이 필드는 대부분의 경우 생략이 가능하며 업체가 위치한 곳를 나타냅니다.
    Organization : 사업자 등록증에 있는 회사명과 일치되는 영문회사명을 입력하시면 됩니다.
    Organization Unit : "리눅스 관리팀", "윈도우 관리팀" 등과 같이 업체의 부서를 입력할 수 있습니다.
    Common Name : 인증받을 도메인주소를 입력하시면 됩니다.

    이 정보로 웹 사이트를 식별하므로 호스트 이름을 변경할 경우 다른 디지털 ID를 요청해야 합니다.
    호스트에 연결하는 클라이언트 브라우저가 디지털 ID의 이름과 URL이 일치하는지를 확인합니다.

    ☞ CSR 항목 입력시 주의사항
    * Common Name 에는 인증서를 설치할 사이트의 도메인의 이름을 정확하게 입력하셔야 합니다.
    * Common Name 에는 IP 주소, 포트번호, 경로명, http:// 나 https:// 등은 포함할 수 없습니다.
    * CSR 항목에는 < > ~ ! @ # $ % ^ * / \ ( ) ? 등의 특수 68 문자를 넣을 수 없습니다.
    * CSR 생성후 서버에 개인키 (Private Key) 가 생성됩니다. 개인키를 삭제하거나 분실할 경우 인증서를 발급받아도 설치가 불가합니다. 따라서 꼭 개인키를 백업받아 두셔야 합니다.
    * 정보입력과정 마지막에 나오는 A challenge password 와 An optional company name 두 항목은 입력하지 마시고 Enter 만 누르고 넘어가야 합니다. 두 정보가 입력될 경우 잘못된 CSR 생성될 수 있습니다.

    ↘ 위 주의사항을 유의하여 아래와 같은 절차로 CSR 생성을 진행합니다.
    사용자 삽입 이미지

    ↘ 생성된 CSR 정보는 아래처럼 확인이 가능합니다.
    사용자 삽입 이미지


    5. 한비로에 접수--->6. 정식 인증서 발급

    생성된 CSR 을 출력하면 아래와 같은 base64 형식의 문서를 볼 수 있습니다.
    사용자 삽입 이미지

    이문서의 첫 줄 -----BEGIN … 부터 마지막 줄 -----END … 까지 복사하여 지정된 SSL 접수페이지에 복사하여 붙여 넣은 뒤 입력정보와 함께 전송하면 접수가 완료됩니다.

    7. 인증서 설치

    접수한 CSR 파일이 정상적으로 생성되었다면 별다른 문제없이 인증서를 발급 받을 수 있습니다.
    인증서 파일은 신청시 기록한 Email 주소를 통해 인증서를 첨부파일로 수신하게 됩니다.

    ① 인증서 서버에 복사

    메일로 받은 인증서 파일을 압축을 해제하시면 AddTrustExternalCARoot.crt,UTNAddTrustServerCA.crt, 도메인.crt 3개의 파일을 보실 수 있습니다.
    여기에서 필요한 파일은 UTNAddTrustServerCA.crt,도메인.crt 2개의 파일입니다.
    이 파일을 서버에서 적절한 위치에 복사합니다.

    ② 웹서버 환경설정

    아파치가 설치된 디렉토리로 이동하여 conf 디렉토리내의 httpd.conf 파일의 복사본을 만들어 둡니다.
    웹서버 설정의 기본이 되는 파일로 만일의 경우를 대비하여 백업본을 유지하는 것이 좋습니다.
    백업이 완료되면 vi 편집기를 이용하여 httpd.conf 내용중 아래사항을 설정하신 정보에 맞게끔 수정합니다.

    httpd.conf 예문
    사용자 삽입 이미지

    1. <VirtualHost 127.0.0.1:443> 127.0.0.1 를 사용하는 장비의 아이피로 변경
     - 443 : SSL 통신포트번호 입니다. 일반적으로 웹서버는 80 포트를 사용합니다.
    2. SSLEngine 스위치 off 를 on 으로 변경해 줍니다.
    3. SSLCertificateFile / SSLCertificateKeyFile 에는 인증서의 설치경로와 개인키 파일의 경로를 적어 줍니다.

    ③ root 인증서 경로설정

    SSLCACertificateFile 에는 root 인증서 위치를 알려주는 것으로 유저의 브라우저에 신뢰받는 CA리스트가 없을 경우를 위해 경로를 반드시 지정해 주어야 합니다.


    ④ 웹서버 재실행
    사용자 삽입 이미지

    설정파일의 정상적인 수정여부를 점검하기 위한 체크 ./httpd -t
    수정된 사항의 적용을 위해 아파치 데몬정지 ./apachectl stop
    아파치 데몬 활성화 ./apachectl startssl ( 아파치 데몬 활성화는 ./apachectl start 로 가능합니다. 여기에 ssl 를 붙여줌으로서 ssl 를 사용하게 됩니다. )

    초기 개인키 생성시 입력했던 패스워드를 기억하시고 계실겁니다. SSL 실행을 위해 패스워드를 물어보는데 이때 개인키 생성시 입력했던 패스워드를 입력하시면 SSL 웹데몬이 활성화 됩니다.

    ⑤ 웹서버 포트점검

    아래와 같이 활성화된 데몬의 포트를 점검해 봅니다.
    사용자 삽입 이미지

    ⑥ 웹서비스 동작상태 점검

    인터넷 주소창에 https://사용도메인 와 입력후 해당 페이지의 정상적인 동작 여부를 점검합니다.
    SSL 설정한 사이트에 대한 정상적인 서비스 상태 점검
    사용자 삽입 이미지

    페이지 하단을 보시면 열쇠 아이콘이 보이게 됩니다. 아이콘을 클릭하게 되면 위와 같이 인증서 정보를 확인하실수 있습니다.


    출처 :http://www.comodossl.co.kr/SSL/InstallGuide/Apache.htm

    Posted by 1010
    01.JAVA/J2me2008. 11. 27. 13:09
    반응형
    SK 텔레콤 : 011 017 -->NATE WAP (최근 네이트ⓜ브라우저 개발)
    LG 텔레콤 : 019 --> Ez-i WAP (LG 텔레콤 역시 조만간 업그레이드된 브라우저를 출시 예정)
    KTF : 016 018 --> ME1.3 (최근 KUN 2002 개발)

    http://www.magicn.com/kun
    (KUN 2002 개발자 페이지)

    http://phone.nate.com/devel/
    (WAP GVM SK-VM SIS Wavelet MPEG4 개발자 페이지 )
    ------------------------------------------------------------------------------------------------
    SK 텔레콤 : 011 017 --> SK-VM GVM WITOP
    LG 텔레콤 : 019 --> JAVA-Station
    KTF : 016 018 --> BREW MAP
    앞으로 나오게 될 통일 플랫폼 : WIPI

    신지소프트 GVM (Mini C)
    개발 회사 : 신지소프트http://sinjisoft.co.kr
    배포 사이트 :http://gvmclub.com
    이미지 지원 : VDI 포맷(*.sbm)

    XCE SK-VM (MIDP1.0 + SKVM API)
    개발 회사 : XCEhttp://www.xce.co.kr/
    배포 사이트 :http://www.developerzone.co.kr/
    이미지 지원 : png, lbm, sis

    SK텔레콤 WITOP (GVM + SK-VM + Thin Multimedia 수용 위해)
    개발 회사 : SK 텔레콤
    배포 사이트 :http://witop.sktelecom.com

    LG텔레콤 JAVA-Station (MIDP + LGT API)
    개발 회사 : LG텔레콤
    배포 사이트 :http://java.ez-i.co.kr/
    테스트 사이트 :http://joyworld.co.kr/
    이미지 지원 : png, sis

    퀄컴 BREW ( C/C++, 멀티팩)
    개발 회사 : 퀄컴http://www.qualcomm.com
    배포 사이트 :http://www.qualcomm.com/brew/kr/
    이미지 지원 : Brew 2.0 bmp, sis, png, bci, jpg

    모빌탑 MAP (C기반)
    개발 회사 : 모빌탑http://www.mobiletop.co.kr/
    배포 사이트 :http://www.mapcp.co.kr/cpadmin2/

    표준플랫폼 WIPI (Clet + Jlet API)
    개발 회사 : 아로마 소프트http://www.aromasoft.co.kr/
    배포 사이트 :http://www.mobilejava.co.kr/
    이미지 지원 : bmp, gif

    ------------------------------------------------------------------------------------------------
    J2ME & BREW 관련사이트
    http://www.joyworld.co.kr/
    http://www.mobilejava.co.kr/
    http://www.mobilelab.co.kr/
    http://www.qualcomm.com/brew/kr/
    http://www.mobilebrew.net/
    http://www.brewsdk.co.kr/
    http://brewis.co.kr/
    http://cafe.daum.net/brew/

    MIDP Source 해외 사이트
    http://midlet.org/jsp/index.jsp
    http://www.midlet.com/
    http://www.midletcentral.com/
    http://www.javamobiles.com/
    http://www.microjava.com/(http://www.kvmworld.com/)
    http://www.spruce.jp/freemidlets/
    http://jshape.com/midp/
    http://jshape.com/midp/forum/wood/
    http://www.corej2me.com/
    http://groups.yahoo.com/야후 구룹

    http://www.anybil.com/무선 인터넷
    http://www.mobilejava.co.kr/mj_home/sub_page/lecsub.jsp핵심강좌
    http://wireless.java.sun.com/midp/samples/index.htmlSUN midp 예제
    Posted by 1010