웹서버 접근제어

기타 | 2009. 11. 10. 14:56
Posted by 시반

Apache 접근 제어 (Access Control)

웹서버를 운영하다보면 “외부의 접근은 허용하지 않으며, 특정 지역에서만 접근을 원하고 싶은데… 쉬운 방법은 없을까? “ 하는 고민을 하게된다. 일반적인 웹사이트야 기본 설정대로 사용하면 되겠지만 소수의 사람들만 사용하기 위한 정보 등이라면 어플리케이션 레벨의  ACL이 아니어도 서버 설정파일(httpd.conf) 이나 디렉토리별 설정파일(.htaccess) 을 통해 간단하게 설정할 수 있다..htaccess 파일을 사용하는 경우에는 이 파일에 있는 인증 지시어를 허용하도록 서버를 설정해야 한다. 이를 위해 디렉토리별 설정파일에 어떤 지시어를 사용할 수 있는지를 결정하는 AllowOverride 지시어를 사용한다.

 서버 디렉토리를 암호로 보호하기

서버의 디렉토리를 암호로 보호하기 위해서 먼저 암호파일을 만들어야 한다.

이 파일은 웹에서 접근할 수 없는 곳에 있어야 하는데 그 이유는 다른사람이 암호파일을 다운로드하지 못하게하기 위해서다.

예를 들어, 문서들이 /usr/local/apache/htdocs에 있다면 암호파일(들)은 /usr/local/apache/passwd에 둔다.

아파치에 포함된 htpasswd 도구를 사용하여 다음과 같이 암호파일을 만들 수  있다. (아파치설치디렉토리/bin/htpasswd) 

 

htpasswd -c /usr/local/apache/passwd/passwords civan htpasswd는 암호를 물어보고, 확인을 위해 암호를 다시

New password: mypassword
Re-type new password: mypassword
Adding password for user civan

 

암호를 물어보고 확인을 위해 암호를 다시 입력하라고 요청한다.

다음으로 서버가 암호를 요청하도록 설정하고, 서버에게 어떤 사용자의 접근을 허용할지 알려줘야 한다.

httpd.conf를 편집하거나 .htaccess 파일을 사용하여 설정한다.

예를 들어, /usr/local/apache/htdocs/secret 디렉토리를 보호하려면, 아래 지시어를 /usr/local/apache/htdocs/secret/.htaccess 파일이나 httpd.conf의 <Directory /usr/local/apache/htdocs/secret> 섹션에 적어야 한다.

 

AuthType Basic
AuthName "Restricted Files"

AuthUserFile /usr/local/apache/passwd/passwds

Require user civan

 

  • AuthType : 사용자 인증 방법 선택. 

기본값은 Basic (mod_auth_basic 이 구현) 을 사용하고 있지만 Basic 인증은 브라우저가 서버로 암호를 암호화하지 않고  전송하기 때문에 기밀 자료를 보호하기 위해서는 다른 방법을 선택.

예를 들면 아파치의 경우 AuthType Digest( mod_auth_digest가 구현) 인증 방법도 지원하고 있으며  매우 안전하다.

일단 클라이언트가 "Restricted Files" 영역에 인증이 성공하였다면,   클라이언트는 자동으로 같은 서버내 "Restricted  Files" 영역으로 표시된 구역에 대해서 동일한 암호를 시도한다. 

그래서 여러 제한 구역이 같은 영역을 공유하면 사용자가 여러번 암호를 입력하지 않아도 된다. 

물론 보안상 이유로 클라이언트는 서버의 호스트명이 다르면 항상 새로 암호를 물어보게 된다.

  • AuthUserFile : htpasswd로 만든 암호파일의 경로를 설정.

사용자가 많은 경우 요청마다 매번 사용자를 인증하기위해 일반 문서파일을 검색하는 것은 시간이 상당히 많이 걸릴 수 있기  때문에 AuthDBMUserFile  지시어를 이용하여 데이타베이스 파일에 사용자 정보를 저장할 수도 있다.

  • Require : 서버의 특정 영역에 접근할 수 있는 사용자를 지정하여 권한부여

그룹권한

앞에서는 디렉토리에 한사람(사용자명이 civan인)에 대한 접근 권한을 부여했다면 이번에는 다수의 사용자들을 그룹으로 묶어 부여하는 방법을 설명합니다.

먼저 그룹명과 해당 그룹에 어떤 사용자들이 있는지 알려주는 그룹파일이 필요하다.

 

#vi /usr/local/apache/passwd/groups

groupA : civan naver google

 

위의 예는 그룹명이 groupA  이며 civan, naver, google이라는 사용자가 들어있다는 그룹파일이다.

 

#htpasswd /usr/local/apache/passwd/passwords naver


추가된 사용자에 대한 암호를 만듭니다. 앞에서와 동일하지만 새로 파일을 생성하는 것이 아닌 기존파일(passwords)에 사용자를 추가합니다. 새로이 암호파일을 만들고자 하는 경우에는 -c옵션을 사용합니다.
 

#vi .hthtaccess

AuthType Basic

AuthName "By Invitation Only"

AuthUserFile /usr/local/apache/passwd/passwds

AuthGroupFile /usr/local/apache/passwd/groups

Require group GroupA


이제 GroupA 그룹에 속하면서 passwords 파일에 항목이 있는 사용자가 올바른 암호를 입력하면 접근을 허용한다.

 

그룹파일을 만들지 않고도 다수의 사용자에 대한 접근제어를 할 수 있는방법이 있다.

 

Require valid-user

 

Require user civan 대신 이 지시어를 사용하면 암호파일에 있는 누구라도 올바른 암호를 입력하기만 하면 접근을 허용하게 된다. 그룹별로 다른 암호파일을 사용하여 그룹과 비슷한 효과를 얻을 수 있으며 이 경우 아파치가 파일 두개(암호파일,그룹파일)가 아닌 한개(암호파일)만을 검사하면 된다는 점이 장점이지만 여러 암호파일을 관리해야 한다는 점과 AuthUserFile 지시어에 정확한 암호파일을 지정해야 한다는 점이 단점이다.
 

문서를 요청한 호스트명 또는 호스트 주소로 접근 제어하기

사용자명과 암호를 사용한 인증뿐 아니라 특정한 접속 장소(IP 또는 도메인)에 따라 사용자의 접근권한을 ‘제어하고자 하는 경우도 있는데 이  경우 Allow 와 Deny 그리고 Order 의 3가지의 지시어를 제공한다. Deny와 Allow 지시어는 이름에서도 암시하는 거와 같이 클라이언트의 주소 또는 호스트명를 기반으로 자원으로의 접근을 거부할 것인지 또는 허용할 지의 여부를 결정하는 지시어로, 사용되어 지는 문법은 다음과 같이 간단하다.

Allow from host 또는 Deny from host

 

이 지시어에서의 host 인자로 사용할 수 있는 것은 매우 유동적이며 그 인자로는 다음과 같다.

  • All  :  모든 호스트의 접근을 허용한다. 예)  Allow from all
  • 도메인명: 호스트의 이름과 매칭되거나, 끝나는 위치의 문자열과 같은 접근을 허용  예) Allow from host.example.com
  • 전체 IP 주소 :  IP 주소의 접근을 허용한다. 예) Allow from 205.252.46.165
  • 부분적인 IP 주소 : 서브넷 제한과 같이 IP 주소의 1 에서 3 바이트까지의 접근을 의미한다. 
    예) Allow from 10 173.20 192.168.2
  • 네트워크/넷마스크 (아파치 1.3 이상에서 가능) : 네트웍 a.b.c.d 그리고 넷마스크 w.x.y.z 와 같은 식으로 구성된다.
    예) Allow from 10.1.0.0/255.255.0.0 
  • CIDR 을 이용한 표기
     넷마스크가 1비트로 구성된 것을 제외하고는 위 경우와 유사하다. 예) 10.1.0.0/16 은 10.1.0.0/255.255.0.0 과 같다. 
  • IPv6와 서브넷 명시 - 예) Allow from 2001:db8:a00:20ff:fea7:ccea/10 

<Directory /usr/local/apache/htdocs> 
            Order deny,allow 
            Deny from all 
            Allow from localhost 192.168.23.0/255.255.255.0
</Directory>

만약 Allow, Deny 가 각각 따로 쓰인다면 지시어를 함께 사용하여 자원의 접근을 통제시 충돌이 일어날 수 있다.

아파치에서는 바로 이러한 충돌을 ‘order’ 지시어를 통하여 해결하고 있다. ‘Order’ 지시어는 Allow 와 Deny 지시어가 함께 쓰여졌을 때 어느 지시어가 우선순위를 가지고 먼저 처리가 되어져야 할지를 결정하며, 다음의 두 가지 값 중에 하나가 사용되어 질 수가 있다.

  • Order deny,allow  : Deny 지시어를 먼저  처리한 후 그 다음 Allow 지시어로 이어진다
  • Order allow,deny  : Allow 지시어를 먼저 처리한 후 그 다음 Deny 지시어로 이어진다. 

둘 중에 어느 것을 사용하느냐 하는 것은 여러분이 제한하고자 하는 사람이 적거나 또는 반대로 대부분의 사람을 포함하는 등의 선택에 따라 달라진다. 예를 들어, 만약 모든 사람들의 접근을 허용하면 반면, 특정 도메인에서 불쾌한 메시지를 게시판에 올리는 사람이 있다면 아래와 같은 설정이 가능하다.

 Order Allow , Deny
 Allow from all 
 Deny from evil.victim.com

 

이와 달리, 회사에서의 접속만을 허용하고 다른 외부의 접근은 모두 허용하지 않을 때는 
 

 Order Deny, Allow
 Deny from all 
 Allow from .company.com

 

HTTP 헤더 기반의 고급 접근 제어

앞서 allow 와 deny 지시어는 호스트 또는 IP 주소를 통해서만 제어가 가능했지만, mod_setenvif 의 모듈을 이용하여 클라이언트가 요청한 HTTP 요청의 헤더정보를 환경변수로 설정하여 HTTP 헤더 기반의 고급 접근 제어도 가능하다.

mod_setenvif 는 두개의 지시어를 제공하는데 , BrowserMatch(BrowserMatchNoCase) 와 SetEnvif(SetEnvifNoCase) 이다. 각 지시어의 문법은 아래와 같다 : 

  • BrowserMatch regex variable[=value] 
  • SetEnvif attribute regex variable[=value]

정규 표현식에 따라 attribute 의 값과 일치가 되면 환경변수로 variable 을 설정하게 된다. 우선, BrowserMatch 를 이용하여 브라우저의 종류에 따라 접근제어를 해 보도록 하자. 
 

BrowserMatch ^MSIE InternetExplorer
<Directory /msie_html/> 
            order deny,allow 
            deny from all 
            allow from env=InternetExplorer
</Directory>


이 예제는, 브라우저가 인터넷 익스플로러인 경우에는 ‘InternetExplorer’ 환경변수를 설정하고 deny 지시어로 모든 접근을 거부하고, allow 지시어를 통해 ‘InternetExplorer’ 로 환경 설정된 브라우저의 접속만 허용하고 있다. SetEnvif 를 이용하여 또 다른 예를 들어 보이겠다. 
 

SetEnvIf Referer ^http://www.test.com/links_page.html referral_ok _ok
<Directory /apache_users_only/> 
            order deny,allow 
            deny from all 
            allow from env=referral_ok
</Directory>


앞서 배운 내용들을 기반으로 위 예제는 “어떠한 역할을 하는 것으로 추측되어 지는가?” 잠깐 생각에 잠기어 보기 바란다.

"http://www.test.com/links_page.html" 을 통해 접근을 하게 되면 referral_ok 의 이름으로 환경변수가 설정되어 지고 “apache_users_only” 디렉토리에는 이 링크를 통한 접속만을 허용하게 된다.

이와 같이 여러분의 상상력을 동원하여 다양한 접근방법을 수행할 수 있다.

attribute 에 해당하는 HTTP 요청헤더의 환경변수는 다음을 포함하여 RFC2616(http://www.rfc-editor.org/rfc/rfc2616.txt) 에서 더 많은 정보를 확인하여 볼 수가 있다.

  • CONTENT_TYPE : 내용물의 마임타입 
  • DATE_GMT : 현재 GMT(greenwich, UK) 시간을 표시 
  • DATE_LOCAL : 현재의 시간과/날짜 
  • DOCUMENT_NAME : 요청한 문서의 이름 
  • DOCUMENT_URI : 문서의 URL 
  • LAST_MODIFIED : 문서가 마지막으로 수정된 날짜 
  • HTTP_REFERER : 클라이언트가 어디를 참조하여 들어왔는지를 나타냄 
  • REMOTE_ADDR : 클라이언트의 IP 주소 
  • REMOTE_HOST : 클라이언트의 도메인 이름 
  • REQUEST_METHOD : HTTP 요청 방법: GET 또는 POST 
  • SERVER_NAME : 서버의 호스트네임 (i.e, www.apache.kr.net) 
  • SERVER_PORT : httpd 에 의해 사용되어 지고 있는 포트번호 (일반적으로 80번) 
  • SERVER_PROTOCOL : http 의 버전 
  • SERVER_SOFTWARE : 웹 서버의 소프트웨어 정보 

“WebZip” 과 같은 많은 프로그램들이 홈페이지에 접속하여 내용을 자동으로 클라이언트의 시스템에 저장해 주는 기능을 가지고 있다. 이러한 류의 접근을 통제하기위해서는 어떠한 방법이 가능할까 ?

BrowserMatch "WebZIP" web_spider
BrowserMatch "Teleport" web_spider
BrowserMatch "Teleport Pro/1.29" web_spider
BrowserMatch "NamoWebEditor" web_spider
BrowserMatch "WebSymmetrix" web_spider
<Directory /usr/local/apache/htdocs> 
            Order allow,deny 
            Allow from all 
            Deny from env = web_spider
</Directory>

 

MINA 기반의 어플리케이션 구조

개발 이야기/MINA | 2009. 5. 28. 18:01
Posted by 시반

MINA 기반의 어플리케이션 구조

개요                                                                                                            

MINA 기반의 어플리케이션의 구조에 대하여 많은 분들이 질문해오셨습니다. 기사를 통해 MINA 기반 어플리케이션이 어떤 아키텍처를 가지고 있는지 살펴보도록 하겠습니다.MINA 관련된 프레젠테이션 자료에서 발췌했습니다.

조감도 :

 

좀더 상세하게 알아볼까요?

 

이미지는 Apache MINA 이용하여 Network Application 빨리 개발하기(JavaOne 2008) 라는 이희승님의 발표자료에서 가져왔습니다.

크게 보면, MINA 기반의 어플리케이션은 3개의 레이어로 구분되어 집니다

·         I/O Service - 실제 I/O 수행하는 부분

·         I/O Filter Chain - 필터/변환, 바이트를 원하는 데이터 구조로 변환(역으로도 가능)

·         I/O Handler실제 비즈니스 로직이 들어가게 되는 부분

그럼 이제 어떻게 MINA 기반의 어플리케이션을 개발하는지 살펴 볼까요

1.    Create I/O service기본으로 제공하는 서비스 (*Acceptor)  또는 스스로 만든 I/O  서비스 중에서 선택합니다

2.    Create Filter Chain요청/응답간의 변환을 처리하기 위해 필터를 지정합니다. 필터는 기본으로 제공하는 필터 사용자 필터 중에서 선택합니다

3.    Create I/O Handler각기 다른 메시지들을 핸들링 하기 위한 비즈니스 로직을 작성합니다.
MINA
어플리케이션을 만드는 것은쉽죠~? ##########2*

 

ps. 마찬가지로 미나 레퍼런스를 번역한 글입니다.

원문은 http://mina.apache.org/mina-based-application-architecture.html 에서 확인할 수 있습니다.

'개발 이야기 > MINA' 카테고리의 다른 글

[MINA] Logging Configuration  (0) 2009.11.30
MINA에서 버퍼 제어하기 - IoBuffer  (0) 2009.06.01
MINA 2.0 에코서버 만들기  (0) 2009.05.21
 

아파치에서 IPv6,IPv4 함께 사용하기

기타 | 2009. 5. 28. 17:48
Posted by 시반

모 업체에서 IPv6와 IPv4를 함께 사용할 수 있는지에 대한 문의가 있었다. 차후 IPv6를 도입할까 하는데 기존IPv4도 함께 사용할 수 있는지에 대한  부분이었는데. 아파치 등 웹서버나 WAS에서 IPv6를 지원한다는 말은 들었는데 동시에 사용할 수 있는지는 잘 몰랐었지만 마침 아파치 레퍼런스 페이지에서 찾아볼수 있어서 올려본다.

아파치를 시작하면 아파치는 컴퓨터의 어떤 포트와 주소에 연결하여, 들어오는 요청을 기다립니다. 기본적으로 아파치는 컴퓨터의 모든 주소에서 기다리게 되지만 아파치가 특정 포트나 선택한 주소만을 기다리게 해야할 경우가 있다. 또 이 문제는 아파치가 어떻게 다른 IP 주소, 호스트명, 포트에 반응할지를 결정하는 가상호스트 기능과도 관련되있다.

Listen 지시어는 서버가 특정 포트나 주소와 포트 조합에서만 요청을 받게 한다. Listen 지시어에 포트 번호만 지정하면, 서버는 모든 인터페이스에서 지정한 포트를 기다린다. 여러 Listen 지시어로 기다릴 여러 주소와 포트를 지정할 수도 있다. 서버는 열거한 주소와 포트로 요청이 들어오면 응답한다.

예를 들어, 서버가 80번과 8000번 포트 모두에서 연결을 받도록 하려면:

Listen 80
Listen 8000

서버가 지정한 두 인터페이스와 포트에서 연결을 기다리도록 하려면,

Listen 192.0.2.1:80
Listen 192.0.2.5:8000

IPv6 주소는 다음과 같이 대괄호로 묶어야 한다:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

 

IPv6에서 특별히 고려할 점

IPv6를 구현한 플래폼이 늘고 있고 APR이 이들 플래폼 대부분에서 IPv6를 지원하기때문에, 아파치는 IPv6 소켓을 할당하여 IPv6로 받은 요청을 처리할 수 있다.

아파치 관리자에게 복잡한 부분은 IPv6 소켓이 IPv4 연결과 IPv6 연결을 모두 처리할 수 있느냐는 점이다. 대부분의 플래폼에서는 IPv4-대응(mapped) IPv6 주소를 사용하여 IPv6 소켓에서 IPv4 연결을 받지만, FreeBSD NetBSD OpenBSD은 시스템전체 정책때문에 기본적으로 허용하지 않는다. 그러나 기본적으로 허용하지않는 시스템이라도 아파치를 위해 특별한 설정 파라미터로 변경할 수 있다.

반면 리눅스와 Tru64 같은 일부 플래폼에서 IPv4 IPv6을 모두 처리하려면 대응 주소를 사용해야만 한다. 아파치가 최소한의 소켓을 사용하여 IPv4 연결과 IPv6 연결을 모두 받도록하려면, IPv4-대응 IPv6 주소를 사용하고 configure 옵션 --enable-v4-mapped를 지정한다.

--enable-v4-mapped FreeBSD, NetBSD, OpenBSD를 제외한 모든 플래폼에서 기본값이고, 아마도 당신의 아파치도 마찬가지일 것이다.

플래폼과 APR의 지원여부와 관계없이 아파치가 IPv4 연결만을 받도록하려면, 다음 예제와 같이 모든 Listen 지시어에 IPv4 주소를 사용한다:

Listen 0.0.0.0:80
Listen 192.0.2.1:80

플래폼에서 지원하며 아파치가 서로 다른 소켓으로 IPv4 연결과 IPv6 연결을 받도록하려면 ( IPv4-대응 주소를 사용하지 않으려면), configure 옵션 --disable-v4-mapped를 지정한다. --disable-v4-mapped FreeBSD, NetBSD, OpenBSD에서 기본값이다.

 

Listen은 가상호스트를 만들지 않는다. 이는 단지 주서버가 어떤 주소와 포트를 기다릴지만 알려준다. <VirtualHost> 지시어를 사용하지 않으면, 서버는 받은 모든 요청을 똑같이 처리한다. 그러나 <VirtualHost>로 여러 주소와 포트에 대해 다른 행동을 지정할 수 있다. 가상호스트를 만들려면 먼저 서버에게 사용할 주소와 포트를 알려줘야 한다. 그리고 특정 주소와 포트에 대한 가상호스트의 행동을 지정할 <VirtualHost> 섹션이 필요하다. 주서버가 기다리지않는 주소와 포트를 사용하는 <VirtualHost>는 접근할 수 없음을 주의하라.

Copyright 2009 The Apache Software Foundation.
Licensed under the
Apache License, Version 2.0.

 

 

MINA 2.0 에코서버 만들기

개발 이야기/MINA | 2009. 5. 21. 11:17
Posted by 시반

이번에 소개하고자 하는것은 이희승씨가 커미터로 계셨다는 

MINA(A Multi-purpose Infrastructure for Network Applications)입니다.

간단하게 말하면 자바의 네트워크 애플리케이션을 위한 프레임워크입니다.
필터를 사용한 뛰어난 확장성과 프로토콜 코덱과 비즈니스 로직을 분리하여 유지보수와 재사용성을 높인것이 특징인데요.
한글레퍼런스나 튜토리얼을 기대했는데 역시 아파치 재단이랄까?

이희승씨를 믿고 있건만 영어의 압박이 저를 힘들게 하네요...-_- a.

하지만 사용법은 그다지 어렵지 않은 듯 보입니다.간단하게 예제 프로그램을 따라 만들어 보았습니다.

MINA v2.0 Quick Guild를 참고하였으며. 현재 버젼은 M5까지 나와있습니다 기존의 문제점을 개선한 MINA3을 준비중이라고 하네요.
일단 예제를 위해서는 MINA코어뿐만 아니라 SLF4J Log4J도 필요로 하고 있구요.
SLF4J의 경우에는 1.5.6 버젼까지 나와있는 상태인데 사용하는 Log4J버젼에 따라 선택하면 됩니다.

slf4j-api-1.5.6.jar파일과 slf4j-logj12-1.5.6.jar을 사용합니다. log4j가 1.2버젼이라서.....
기타 JDK6.0, Eclipse3.4 환경에서 테스트합니다.

 
MinaTimeServer

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
 
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 
public class MinaTimeServer
{
   
private static final int PORT = 9123;
 
   
public static void main(String[] args) throws IOException
   
{
       
IoAcceptor acceptor = new NioSocketAcceptor();

        acceptor
.getFilterChain().addLast( "logger", new LoggingFilter() );
        acceptor
.getFilterChain().addLast("codec", new ProtocolCodecFilter(
                                           
new TextLineCodecFactory(Charset.forName("UTF-8"))));
 
        acceptor
.setHandler(new TimeServerHandler());
 
        acceptor
.getSessionConfig().setReadBufferSize(2048);
        acceptor
.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
 
        acceptor
.bind(new InetSocketAddress(PORT));
   
}
}


Non-Blocking IO로 만듭니다. 클라이언트의 연결 및 실시간 요청을 처리할 리스너를 등록합니다.

IoAcceptor 인터페이스로 구현된 acceptor 객체에 하나이상의 필터들을 등록할 수 있는데 이것을 FilterChain이라 합니다.

이 필터체인이라는 것에 addLast를 통해 필터들을 등록합니다.

위와 같이 로깅을 하거나 인코딩 코덱을 만들어 사용할 수 있습니다.
핸들러를 추가하고 버퍼와 유휴시간을 정의한 후에 PORT를 설정하여 Bind합니다.

TimeServerHandler

import java.util.Date;
 
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
 
public class TimeServerHandler extends IoHandlerAdapter
{

   
@Override
   
public void exceptionCaught(IoSession session, Throwable cause)
       
throws Exception
   
{
        cause
.printStackTrace();
   
}

   
@Override
   
public void messageReceived(IoSession session, Object message)
       
throws Exception
   
{
       
String str = message.toString();
 
       
if(str.trim().equalsIgnoreCase("quit"))
       
{
            session
.close(true);
           
return;
       
}
 
       
Date date = new Date();
        session
.write(date.toString() + "\r");
       
System.out.println("Message written...");
   
}

   
@Override
   
public void sessionIdle(IoSession session, IdleStatus status)
       
throws Exception
   
{
       
System.out.println("IDLE " + session.getIdleCount(status));
   
}
}


이녀석이 실제로 통신에 사용되는 핸들러입니다. 메시지를 받을때 마다 messageReceived이 호출됩니다.
쓰레드를 이용하고 있으며, 콜백형식으로 작동하는 것을 알 수 있습니다.

sessionIdle을 사용하면 Main에서 정의한 유휴시간마다 호출됩니다.

앞서 10초로 설정해 두었으니 10초동안 유휴상태로 있다면 그때마다 이 함수가 호출됩니다.

getIdleCount를 이용해 얼마나 유휴상태에 있는지를 확인하도록 합니다. 서버를 완성했으니 실행해 볼까요.

c:>telnet localhost 9123

 


quit를 입력하면 종료되고 그 이외의 문자를 입력하면 시간이 출력되는 것을 알 수 있습니다.

한글을 입력시 MalformedInputException이 나면서 동작안하는 경우가 있는데

인코딩타입을 UTF-8로 바꾸어주면됩니다.

번역한 튜토리얼은 첨부파일로 첨부합니다. 최대한 매끄러게 번역을 하려고 했는데. 앞서 이야기했지만 영어가 딸려놔서리..

오역이나 이상한 것들은 기냥 구박마시고 조용히 알려주세요..*^^*

 

'개발 이야기 > MINA' 카테고리의 다른 글

[MINA] Logging Configuration  (0) 2009.11.30
MINA에서 버퍼 제어하기 - IoBuffer  (0) 2009.06.01
MINA 기반의 어플리케이션 구조  (0) 2009.05.28
 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)