'개발/WAS_JBOSS'에 해당되는 글 8건

  1. 2009.06.19 XSS(Cross Site Scripting: 크로스 사이트 스크립팅) == CSS
  2. 2009.06.04 HTTP 에러코드와 상태 코드 정리
  3. 2009.06.02 JBoss DataSource 설정
  4. 2009.05.28 [CachedConnectionManger] Closing a connection for you.
  5. 2009.05.27 jboss 4.2.3 AS datasource failover 설정
  6. 2009.04.01 JBoss Slim Domain 구성
  7. 2009.03.26 [JBOSS/TOMCAT] JBOSS/TOMCAT 에서 심볼릭링크 디렉토리 허용 방법
  8. 2009.03.19 JBoss 한글 처리(다국어 포함) - Encoding Filter
2009. 6. 19. 11:13

XSS(Cross Site Scripting: 크로스 사이트 스크립팅) == CSS





IE 8 ㅡㅡ;; "교차"라는 말도 맞긴 하지만, 은근히  애매한듯...

 

자, 이제 크로스사이트 스크립팅(XSS)에 관하여 정리해보자.

 

날도 뻐근하고, 봄이면.. 잠만 퍼질러 자는 체질이라.. 너무 놀았네..

 

XSS사이트 스크립트의 일반적인 공식에 대해서 알아보겠다..

 

웹 사이트를 들어가보게 되면, 기본적인 게시판, 메일등 사용자가 직접 올릴수 있는 부분이 한개씩은 있기 마련이다.

위의 그림이 XSS의 기본적인 그림을 그린것이다.

 

1. 공격자는 서버에게 타겟(불특정 다수)이 읽을수 있도록, 내용과 악성 스크립트를 포함시킨 코드를 올리게 된다.

 

2. 타겟은 글을 읽음으로서, 공격자에게 자신이 의도치 않은 쿠키값을 전송하게 된다.

 

3. 쿠키 정보를 수집한 공격자는 타겟의 계정과 동일하게 모든 권한을 가지게 된다.

 

[ 쿠키(Cookie) ]

 

 

- 사용자가 어떠한 웹서버의 접속을 요청하게 되면, 로컬 시스템은 쿠키값을 참조하여 접속하게 된다.

   

   기존의 사이트 쿠키값이 없을 경우, 웹 서버에 접속하게 되면 자신의 시스템에 4kbyte이하의 쿠키값이 생성한다.

  

   쿠키값은 사용자의 브라우저의 정보를 쿠키값에 지정하게 되며, Windows_Server에서의 경로를 표시하였다.

 

각각의 포함된 쿠키값은 Web_Server별로 정리되어져 있으며, 사용자 ID와 접속 서버로 이루어져 있다.

 

일반적으로 확인하게 되면, Domain Name Server / 구분 ID(숫자) / 쿠키만기일 등의 구조로 이루어질 것이다.

 

그렇다면?? 왜 쿠키값이 위험한 것일까??

 

쿠키는 일반적으로 위의 정보를 제외한, 접속자의 개인 정보까지 포함되어 있어 취약점으로 발전해온 것이다.

 

내가 만약 네이버에 접속하였을 경우, 그에 대한 ID와 PW는 쿠키값이 포함되어져 있다.

 

네이버에 처음 접속하였다고 하자. 그렇다면 네이버 서버에 접속하게 되면, 4kbyte이하의 쿠키값이 접속 호스트에 저장이 될것이며,

 

그에 대한 쿠키값은 다음 접속시 접속할 서버는 쿠키값을 가지고, 파악하게 된다.

 

쿠키값은 접속 종료시 즉각, 정보가 사라지는 것이 아니다.

 

간혹가다 사이트 계정으로 접속하여, 브라우저를 끄고, 다시 접속해보면 기존의 ID계정으로 접속해있는 것을 보았을 것이다.

 

[ 쿠키(Cookie)의 중요성 ]

 

1. 사용자의 계정 정보

 

2. 자주 방문하는 서버의 정보

 

3. 장바구니 시스템(물건 구매시 쿠키값에 남는 현상)

    위와 같은 것들이 일반적인 쿠키의 적용 방식이다.

 

[ XSS 공격 특성 ]

- 기본적인 설명은 위에서 하였으므로, XSS에 대해서 더욱더 들어가보자.

 

[ 공격 순서 ]

1. 게시판과 같은 응용 프로그램에 스크립트 작성 언어를 올려놓게 된다.(불특정 다수)

 


2. 파일 열람시 타겟은 자신도 모르게 쿠키값을 가로 채이게 된다.

 

3. 일반적으로, 공격자는 파로스와 같은 툴로서 쿠키값을 확인하게 된다.



 

4. 쿠키값을 이용하여, 계정 도용이 가능하다

 

[ 방어 대책 ]

1. 쿠키 값에 중요한 정보는 응용 프로그램 관리자가 포함되지 않도록 설정.

 

2. 사용자의 입력 값에대한 필터링

    <script></script> / <javascript> / document.cookie

 

3. HTML 태그의 미활성화(동적 웹 특성에 대한 HTML활성화.)

 

4. 스크립트 언어(ASP,PHP,JAVA등)의 문구를 다른 코드로 대체, 혹은 필터링

 

5. 가장 중요한 것은 관리자의 지속적인 점검

2009. 6. 4. 15:01

HTTP 에러코드와 상태 코드 정리





상태코드 메세지 설명
100 Continue
클라이언트로부터 일부 요청을 받았으니 나머지 요청 정보를 계속 보내 주시오.
101 Switching Protocols
서버는 클라이언트의 요청대로 Upgrade 헤더를 따라 다른 프로토콜로 바꿀 것임.
200 Ok
모든 것이 정상적임. GET이나 POST 요청 뒤에 문서가 온다. 이것은 서블릿의 기본 상태다. setStatus를 사용하지 않으면 이 상태코드를 얻게 된다.
201 Created
서버에서 문서를 만들었음. Location 헤더는 그 URL을 가리킨다.
202 Accepted
요청이 수행되었지만 처리는 끝나지 않았음.
203 Non-Authoritative Information
문서는 정상적으로 반환되었지만 복사본이 사용되었으므로 응답 헤더중 일부가 정확하지 않을 수 도 있음.
204 No Content
새 문서 없음. 브라우저는 이전 문서를 계속 보여줘야 한다. 이것은 사용자가 페이지를 주기적으로 리로드를 하던 중 이전 페이지가 이미 만료되었을 때 사용할 수 있다. 하지만 Refresh 응답 헤더나 같은 헤더를 사용 해서 페이지를 자동으로 리로드 시켰을 때는 동작하지 않는다. 왜냐하면 이 상태 코드를 반환하면 추후의 리로딩이 멈추기 때문이다. 하지 만 자바 스크립트로 리로드하게 해 주는 것은 작동한다.
205 Reset Content
새 문서 없음. 하지만 브라우저는 문서 창을 리셋해야 한다. 브라우저가 CGI 폼 필드를 전부 지우도록 할 때 사용 된다.
206 Partial Content
클라이언트가 Range 헤더와 함께 요청의 일부분을 보냈고 서버는 이를 수행했음.
300 Multiple Choices
요청된 문서가 여러 군데서 발견되었음. 이 때 서버는 해당하는 모든 문서들을 나열할 것이다. 만약 서버가 선호하는 선택이 있으면 Location 응답 헤더에 나열해야 한다.
301 Moved Permanently
요청된 문서는 어딘가에 있고 그 문서에 대한 URL은 Location 응답 헤더에 주어졌음. 브라우저는 자동적으로 새 URL의 링크를 따라가야 한다.
302 Found
301과 비슷하지만 새 URL은 임시 저장 장소로 해석된다. 이 메시지는 HTTP 1.0에서는 ‘Moved Temporarily'였다. 그리고 HttpServletResponse의 상수는 SC_FOUND가 아니라 SC_MOVED_TEMPORARILY다. 이것은 매우 유용한 헤더인데 이 헤더를 통해 브라우저가 자동적으로 새 URL의 링크를 따라가기 때문이다. 이 상태 코드는 아주 유용하기 때문에 이 상태 코드를 위해 sendRedirect 라는 특별한 메소드가 있다. response.sendRedirect(url)을 사용하는 것은 response.setStatus(response.SC_MOVED_TEMPORARILY)과 response.setHeader("Location", url)를 쓰는 것에 비해 몇 가지 장점이 있다. 첫째, 더 쉽게 사용할 수 있다. 둘째, sendRedirect을 써서 서블릿이 그 링크를 포함한 페이지를 자동으로 만들어 준다(자동으로 redirect를 따라갈 수 없는 오래 된 브라우저에서도 볼 수 있게 해 준다). 마지막으로, sendRedirect에서는 상대 URL이 절대 URL로 해석되기 때문에 상대 URL도 다룰 수 있다. 이 상태 코드는 종종 301번과 혼용된다. 예를 들어 (맨 마지막에 ‘/'이 빠짐)과 같이 오류가 있는 요청에 대해 어떤 서버는 301을 어떤 서버는 302 를 보낸다. 기술적으로 브라우저는 원 요청이 GET이었다면 자동적으로 리다이렉션을 따라 가도록 되어 있다. 더 자세한 사항은 307 헤더를 보세요.
303 See Other
301/302과 같지만 원래 요청이 POST였을 경우 리다이렉트 되는 문서(Location 헤더에 주어졌다) GET을 통해 받아야 한다.
304 Not Modified
클라이언트의 캐시에 이 문서가 저장되었고 선택적인 요청에 의해 수행됨(보통 지정된 날짜보다 더 나중의 문서만을 보여주도록 하는 If-Modified-Since 헤더의 경우). 서버는 클라이언트에게 캐시에 저장된 이전 문서를 계속 사용해야 한다고 말할 것이다.
305 Use Proxy
요청된 문서는 Location 헤더에 나열된 프록시를 통해 추출되어야 함.
307 Temporary Redirect
Temporary Redirect 이것은 302 ("Found" 또는 "Temporarily Moved")와 같다. 많은 브라우저에서 메시지가POST일 때 원래는 303 응답의 POST 요청의 리다이렉션을 따라 가야 함에도 불구하고 302의 응답을 따르기 때문에 HTTP 1.1에서 추가되었다. 303 응답은 모호하지 않도록 의도되었다. 303 응답의 경우에 대해서는 리다이렉트 된 GET과 POST 요청을 따르고 307 응답의 경우에는 GET 요청만 따른다. 몇 가지 이유로 HttpServletResponse에는 이 상태코드에 해당하는 상수가 없다.
400 Bad Request
요청에 문법적으로 잘못된 부분이 있음.
401 Bad Request
클라이언트가 올바른 허가를 받지 않고 허가가 필요한 페이지에 접근하려 함. 여기에 대한 응답으로 브라우저가 대화창을 열어 사용자 이름과 암호를 받아들이도록 하는 WWW-Authenticate 헤더를 포함해야 한다.
403 Forbidden
사용 권한에 관계없이 내용을 볼 수 없음. 종종 파일 이름이 잘못되었거나 서버의 디렉터리 퍼미션이 잘못 되었을 때 나온다.
404 Not Found
이 주소에서는 어떤 내용도 발견할 수 없음. 이것은 표준 ‘no such page'응답이다. 이 상태 코드는 아주 일반적인 응답이다. 그래서 이 상태코드를 위한 HttpServletResponse:sendError(message)라는 특별한 메소드가 있다. sendError는 serStatus에 비해 에러 메시지를 보여주는 에러 페이지를 자동적으로 만들어 준다는 장점이 있다.
405 Method Not Allowed
요청 메소드(GET, POST, HEAD, DELETE, PUT, TRACE 등) 를 특정 자원에 대해서는 쓸 수 없음.
406 Not Acceptable
지정된 자원이 클라이언트의 Accept 헤더에 명시된 것과 호환 되지 않는 MIME content-type을 생성함.
407 Proxy Authentication Required
401과 비슷하지만 서버가 Proxy-Authenticate 헤더를 반환해야 한다.
408 Request Timeout
클라이언트가 요청을 보내는 데 너무 오랜 시간이 걸림.
409 Conflict
보통 PUT 요청과 관계 있다. 보통 틀린 버전의 파일을 업로드할 경우 발생한다.
410 Gone
문서가 사라졌고 포워딩할 주소도 없음. 404와 다른 점은 이 경우 문서가 완전히 사라졌다는 것을 서버가 안다는 점이다. 404는 어떤 이유인지는 모르는데 단지 요청한 것을 사용할 수 없다는 것을 의미한다.
411 Length Required
클라이언트가 Content-Length를 보내지 않으면 서버가 처리할 수 없음.
412 Precondition Failed
요청 헤더에 설정되어 있는 어떤 조건이 맞지 않음.
413 Request Entity Too Large
요청된 문서가 현재 서버가 다룰 수 있는 크기보다 큼. 만약 서버에서 나중에 다룰 수 있다고 생각되면 Retry-After 헤더를 포함시켜야 한다. (HTTP 1.1에서 새로 등장)
414 Request URI Too Long
URI가 너무 길다.
415 Unsupported Media Type
요청이 알려지지 않은 형태임
416 Requested Range Not Satisfiable
클라이언트가 요청에 적당하지 않은 Range 헤더를 포함시켰음
417 Expectation Failed
Expect 요청 헤더의 값이 맞지 않음.
500 Internal Server Error
일반적인 ‘server is confused' 메시지. 종종 CGI 프로그램이나 서블릿의 결과가 잘못되거나 적절하지 않은 헤더를 만들었을 때 발생한다.
501 Not Implemented
요청한 것을 서버에서 지원하지 않음. 예를 들면 클라이언트가 서버에서 지원하지 않는 PUT과 같은 명령을 내렸을 때 발생한다.
502 Bad Gateway
프록시나 게이트웨이의 역할을 하는 서버에서 볼 수 있다. 초기 서버가 원격 서버로부터 부적절한 응답을 받았음을 나타낸다.
503 Service Unavailable
처리할 수 있는 한계를 벗어나 과도하게 요청이 들어와서 서버가 응답할 수 없음. 예를 들면 스레드나 데이터베이스 연결이 가득 차 있을 때 서블릿에서 이런 헤더를 반환한다. 서버는 Retry-After 헤더를 낼 수 있다.
504 Gateway Timeout
프록시나 게이트웨이의 역할을 하는 서버에서 볼 수 있다. 초기 서버가 원격 서버로부터 응답을 받을 수 없음을 나타낸다.
505 HTTP Version Not Supported
서버가 요청 라인에 지정된 HTTP 버전을 지원하지 않음.


 자세한건 RFC2616 문서를 보세요.

(Request For Comments :

http://www.rfc-editor.org/cgi-bin/rfcdoctype.pl?loc=RFC&letsgo=2616&type=ftp&file_format=txt

http://www.w3.org/Protocols/rfc2616/rfc2616.html )

 

1xx : 안내코드

100 : CONTINUE

101 : SWITCHING_PROTOCOLS , 규약을 전환

102 : PROCESSING

 

2xx : SUCCESS에 관한 코드

200 : OK , 성공적으로 요구를 전달하였음.

201 : CREATED , 요구가 충족되어 새로운 자원을 생성하였음

202 : ACCEPTED , 요구가 접수되었으며 아직 처리가 완료되지는 않았음. (단순한 접수여부이며 처리의 성공여부는 아님)

203 : NON_AUTHORITATIVE Information , 인증되지 않은 정보 (서버에서 사용하도록 정의되지 않는 정보세트를 말함)

204 : NO_CONTENT , 클라언트 요구을 처리했으나 전송할 데이터가 없음

       (기존내용의 변화없는 추가적인 정보입력을 실행할 경우에 해당함)

205 : RESET_CONTENT , 내용을 reset

206 : PARTIAL_CONTENT , 부분적으로 요구를 완료하였음.

207 : MULTI_STATUS

 

3xx : REDIRECT에 관한 코드 (처리를 위해 추가적인 동작이 필요함)

300 : MULTIPLE_CHOICES , 복수 선택

301 : MOVED_PERMANENTLY , 요청한 자원이 영구한 URI가 할당되어 이동함.

302 : MOVED_TEMPORARILY , 요청한 자원이 별도의 임시 URI에 할당되어 이동함.

303 : SEE_OTHER , 다시 다른것을 참조함.

304 : NOT_MODIFIED , 별다른 변경이 없이 응답되었음

305 : USE_PROXY , 요청된 자원은 프락시를 통해야만 접근이 됨

306 : TEMPORARY_REDIRECT

 

4xx : CLIENT_ERROR에 관한 코드 (요구 메시지가 처리할 수 없을 때)

400 : BAD_REQUEST , 클라이언트의 요청을 서버가 이해하지 못함.

401 : UNAUTHORIZED , 요청에 대한 응답이 사용자인증을 필요로 할 경우.

402 : PAYMENT_REQUIRED  , 예약되어 있음

403 : FORBIDDEN , 금지됨 (요청은 이해하였으나 금지되어있는 요청임)

404 : NOT_FOUND , Request-URI를 찾을 수 없음

405 : METHOD_NOT_ALLOWED , URI에서 사용되지 않는 method를 요청함.

406 : NOT_ACCEPTABLE , 접수할수없음을 나타냄.

407 : PROXY_AUTHENTICATION_REQUIRED , 프락시에서 먼저 인증을 해야함.

408 : REQUEST_TIME_OUT , 요청한 시간내에 응답을 하지 못함.

409 : CONFLICT , 충돌 (어떠한 부분의 충돌로 응답하지 못함)

410 : GONE , 영구적으로 사용할 수 없는 경우에 해당하며 그렇지 않으면 401로 응답함.

411 : LENGTH_REQUIRED , 유효하지 못한 Content-Length로 요청을 하였음.

412 : PRECONDITION_FAILED , 전체조건 실패 ( 하나이상의 Request-Header에 기재된 내용이 실패됨)

413 : REQUEST_ENTITY_TOO_LARGE , 요구 entity가 너무커서 처리가 거부됨.

414 : REQUEST_URI_TOO_LARGE ,URI길이가 허용보다 커서 처리가 거부됨.

415 : UNSUPPORTED_MEDIA_TYPE ,  지원되지 않는 포맷으로 거부됨.

416 : RANGE_NOT_SATISFIABLE

417 : EXPECTATION_FAILED

422 : UNPROCESSABLE_ENTITY

423 : LOCKED

424 : FAILED_DEPENDENCY

 

5xx : SERVER_ERROR에 관한 코드 (서버가 요청을 처리하는 과정에서 문제발생)

500 : INTERNAL_SERVER_ERROR , 내부서버 오류 (잘못된 스크립트 실행과 같은 예상하지 못한 오류일 경우)

501 : NOT_IMPLEMENTED , 구현되지 않았음 (요청을 처리하는데 필요한 기능이 구현되지 않았음)

502 : BAD_GATEWAY , 나쁜 게이트웨이 (게이트웨이 서버가 올바르지 않은 응답을 수신 할 경우)

503 : SERVICE_UNAVAILABLE , 과부하 또는 여러가지 이유로 현재 요청을 처리하지 못함.

       (임시적이며 일정한 시간뒤에 정상적으로 서비스 가능)

504 : GATEWAY_TIME_OUT , 게이트웨이(또는 프락시)서버가 시간내에 요청의 처리를 완료하는 수신을 받지 못함.

505 : VERSION_NOT_SUPPORTED , 지원되지 않는 HTTP 버젼임.

506 : VARIANT_ALSO_VARIES

507 : INSUFFICIENT_STORAGE

510 : NOT_EXTENDED

 

601 : 접근불가. HTTP CONNECT TIMEOUT

ㅇ 3초내에 CP로 HTTP Connection을 하지 못한 경우

   () Network 이상, CP 과부하로 인해 CP Web서버로 connection 안될 )

2009. 6. 2. 09:14

JBoss DataSource 설정





JBoss에서 DataSource 설정 절차

(1) JDBC 라이브러리 설치

     해당 DB 벤더의 JDBC 라이브러리를 $JBOSS_HOME/server/<instance>/lib 디렉터리에 복사한다.

     절대로 어플리케이션과 함께 패키징해서는 안된다. 예를 들어 ojdbc14.jar를 WEB-INF/lib에 두면 다양한 에러를 경험할 수 있다.

 

(2) xxx-ds.xml 작성 및 디플로이

     JBoss에서 데이터소스 설정은 파일명이 -ds.xml로 끝나는 XML 파일을 작성해 deploy 디렉터리에 두면 된다. $JBOSS_HOME/docs/examples/jca 디렉터리를 보면 벤더별 데이터소스 설정 예제들을 볼 수 있다.

 

이제 예제를 통해 설정항목들을 살펴본다.

 $JBOSS_HOME/server/default/deploy/example-ds.xml

 <?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/OracleDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@203.231.14.100:1521:XE</connection-url>
    <driver-class>oracle.jdbc.OracleDriver</driver-class>
    <user-name>scott</user-name>
    <password>tiger</password>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>


    <min-pool-size>0</min-pool-size>
    <max-pool-size>20</max-pool-size>


    <blocking-timeout-millis>5000</blocking-timeout-millis>
    <idle-timeout-minutes>15</idle-timeout-minutes>


    <prepared-statement-cache-size>100</prepared-statement-cache-size>
    <track-statements>false</track-statements>


    <valid-connection-checker-class-name>
        org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
    </valid-connection-checker-class-name>
    <exception-sorter-class-name>
        org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
    </exception-sorter-class-name>


    <metadata>
         <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

 

먼저 root element가 <datasources>로 복수형인게 눈에 띄는데 글자 그대로 하나의 -ds.xml 파일 하나에 여러 개의 데이터소스를 설정할 수 있다.

 

그 하위에 <local-tx-datasource>가 선언되어 있는데 JBoss에서는 트랜잭션 유형에 따라 <local-tx-datasource>, <xa-datasource>, <no-tx-datasource>로 element 레벨에서 구분해서 데이터소스를 설정한다. 분산 트랜잭션 처리를 위해 XA를 사용한다면 <xa-datasource>를, 그렇지 않다면 <local-tx-datasource>를 사용하면 된다.

 

그러면 <local-tx-datasource>로 선언할 때의 기본 설정 항목부터 살펴본다.

 

기본 설정 항목

1) <driver-class>

 위의 example-ds.xml에서와 같이 <local-tx-datasource>를 사용할 경우에는 java.sql.Driver 인터페이스를 구현한 드라이버 클래스를 <driver-class>에 설정한다.

Oracle 8i

oracle.jdbc.driver.OracleDriver

Oracle 9i/10g

oracle.jdbc.OracleDriver

Informix

com.informix.jdbc.IfxDriver

MS SQL

com.microsoft.jdbc.sqlserver.SQLServerDriver

MySQL

com.mysql.jdbc.Driver

 

2) <connection-url>

 DB접속 URL을 명시한다.

Oracle thin

jdbc:oracle:thin:@host:port:sid

Oracle thin (description)

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port))(CONNECT_DATA=(SERVICE_NAME=sid)))

Oracle oci

jdbc:oracle:oci:@sid

Informix

jdbc:informix-sqli://host:port/dbname:INFORMIXSERVER=servername

MS SQL

jdbc:microsoft:sqlserver://host:port;DatabaseName=dbname

MySQL

jdbc:mysql://host:port/dbname

 

3) <jndi-name>과 <use-java-context>

 JNDI에서 데이터소스를 찾을 때 사용할 이름으로 jdbc/xxx 형식을 사용하는 것을 권장한다.

주의할 점은 데이터소스는 JNDI에 바인딩될 때 java: 네임스페이스로 바인딩된다는 점이다. 이때문에 Context.lookup()시에 java:/jdbc/xxx와 같이 명시해야 데이터소스를 찾을 수 있다.

만약 WebLogic에서 처럼 global하게 바인딩하려면 <use-java-context>false</use-java-context>로 설정하면 된다. 이 때는 Context.lookup()시에 jdbc/xxx로 명시한다.

 

4) <user-name>과 <password>

 DB 접속 계정과 패스워드를 명시한다. 패스워드를 따로 암호화할 필요가 있다면 이전 포스트를 참고한다.

 

5) <transaction-isolation>

트랜잭션 격리 레벨을 설정한다. TRANSACTION_NONE, TRANSACTION_READ_UNCOMMITTED, TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ,
TRANSACTION_SERIALIZABLE 중에서 DB에서 지원하는 레벨을 설정할 수 있다.

 

Connection Pool 크기 설정

1) <min-pool-size>

 Pool에 유지할 최소 connection 개수로 기본값은 0. 기본적으로 최초 getConnection() 호출전까지 물리적인 db connection은 만들어지지 않는다. 데이터소스 디플로이시에 <min-pool-size>만큼 connection을 만들고자 한다면 <prefill>true</prefill>을 추가로 설정해준다.

 

2) <max-pool-size>

 최대 connection 개수를 설정한다. 기본값은 20.

 

각종 Timeout 설정

1) <blocking-timeout-millis>

 모든 connection이 사용중일 때 getConnection()에서 connection이 반환될 때까지 기다릴 시간으로 ms 단위이다.

 

2) <idle-timeout-minute>

 pool에서 일정 시간동안 사용되지 않고 있는 connection을 닫도록 설정할 수 있는데 그 시간을 분 단위로 설정한다.

 

3) <query-timeout>

 query에 대한 응답을 기다리며 대기할 수 있는 시간을 초 단위로 설정한다.  트랜잭션 Timeout이 설정되어 있는 경우에는 <set-tx-query-timeout>true</set-tx-query-timeout>을 추가로 설정해 트랜잭션 timeout까지 남아 있는 시간을 query timeout으로 자동으로 설정할 수 있다.

 

Connection 에러 처리 설정

1) <check-valid-connection-sql>

 getConnection()시 pool에서 어플리케이션에 connection을 반환하기 전에 connection 상태를 체크하는데 사용할 SQL을 명시한다.

 ex) SELECT 1 FRORM DUAL

 

2) <valid-connection-checker-class-name>

 getConnection()시 pool에서 어플리케이션에 connection을 반환하기 전에 connection 상태를 체크하는 DB 벤더별 클래스를 명시한다. Oracle, MySQL에 대한 구현체가 제공된다

Oracle

org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker

MySQL

org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker

 

3) <exception-sorter-class-name>

 SQLException 발생시 connection error를 검출하는데 사용할 클래스를 명시한다. 예외가 Connection 문제로 발생한 경우 해당 connection을 close하게 된다.

Oracle

org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter

MySQL

org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter

Sybase

org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter

Informix

org.jboss.resource.adapter.jdbc.vendor.InformixExceptionSorter

 

4) <background-validation>

 connection 상태를 매번 getConnection()시마다 체크하지 않고 일정주기로 백그라운드에서 체크할지 여부를 설정한다. 기본값은 false이다.

 

5) <background-validation-minutes>

 connection 상태를 백그라운드로 체크하도록 설정한 경우 그 주기를 분 단위로 설정한다. 기본값은 10분

 

최적화 관련 설정 항목

1) <prepared-statement-cache-size>

 PreparedStatement를 캐쉬해서 성능 향상을 꾀한다. 기본값은 0이다. 이 값이 Oracle에 설정된 open_cursor 값 보다 크면 ORA-01000 "maximum open cursors exceeded"가 발생할 수 있다.

 

Connection 초기 설정

1) <new-connection-sql>

 새로 물리적인 connection을 생성할 때 마다 수행할 SQL을 설정한다. DB session 설정이 필요한 경우 유용하다.

  ex) <new-connection-sql>ALTER SESSION SET nls_date_format="YYYY-MM-DD HH24:MI:ss"</new-connection-sql>

2009. 5. 28. 21:18

[CachedConnectionManger] Closing a connection for you.





CMT를 사용하지 않고 iBATIS의 트랜잭션을 이용해 수동으로 트랜잭션 관리를 하고 있었다.

그런데 JBOSS에서는 CachedconnectionManager란 녀석이 친절하게 Connection leak을 방지하기 위해 Connection을 끊어준다.
(JBOSS 입장에서는 iBATIS의 connection관리 행위를 이해하지 못하므로)

그래서 답은 CMT를 사용하거나, 해당 기능을 사용하지 않으면 된다는 것이다.
물론 그로인해 Connection leak에 대한 책임이 WAS에게서 개발자로 넘어오게 되긴 하지만 말이다.

참고글에서는 persistant framework 을 믿고 해당 기능을 끄라는데, 왠지 찜찜하다.

다음은 원글이다.

What does the message "Closing a connection for you" mean?

It means you are not closing your connections to return them to the pool. To avoid connection leaks you should have code like the following:

Connection connection = dataSource.getConnection();
try
{
// DO WORK
}
finally
{
   try
   {
       connection.close();
   }
   catch (Throwable ignored)
   {
   }
}

For jdbc you should do the same thing for Statements and ResultSets. Normally Statements are closed when the Connection is closed, but connection pooling means the close does not happen. Similarly, if you have prepared statements in a cache, ResultSets need to be closed.

Thread Local Patterns

Many persistent frameworks (hibernate/ojb) open and close connections "at random". i.e. As far as JBoss is concerned it looks like one ejb allocated the connection and another closed it.

The connection close checking does not understand this behaviour. It expects the same ejb that allocated the connection to also close it.

If you use such a pattern, you can turn off this message (see below) but you are on your own when it comes to detecting connection leaks. From 3.2.6 there is a "listInUseConnections" on the CachedConnectionManager. However, there is this known issue with some transacion demarcation semantics. This is not really a JBoss use, more that ThreadLocal patterns bypass J2EE semantics. If you do hit the problem removing the CachedConnectionInterceptor from the conf/standardjboss.xml will workaround the spurious message. You can trust hibernate at least to close connections properly provided you are ending user transactions correctly.

Turning off Connection Close Checking

In production you don't need this checking. Hopefully you have found all the connection leaks during development. You can turn it off on the CachedConnectionManager.

  • transaction-service.xml for 3.2.x
  • jbossjca-service.xml for 4.x

Change "Debug" to false.

  <mbean code="org.jboss.resource.connectionmanager.CachedConnectionManager" 
         name="jboss.jca:service=CachedConnectionManager">
    <depends optional-attribute-name="TransactionManagerServiceName">jboss:service=TransactionManager</depends>

    <!-- Enable connection close debug monitoring -->
    <attribute name="Debug">false</attribute>

Related

2009. 5. 27. 10:13

jboss 4.2.3 AS datasource failover 설정






<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc.dsCizle</jndi-name>
<connection-url>jdbc:mysql://xxx.xxx.xxx.xxx:3306,xx2.xx2.xx2.xx2:3306/ticketbox?failOverReadOnly=false</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>xxxx</user-name>
    <password>xxxx</password>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>100</max-pool-size>
    <blocking-timeout-millis>5000</blocking-timeout-millis>
    <idle-timeout-minutes>15</idle-timeout-minutes>

<check-valid-connection-sql>select '1'</check-valid-connection-sql>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>

</datasources>

2009. 4. 1. 13:40

JBoss Slim Domain 구성





JBoss Cluster domain을 구성하던 중 불필요한 기능을 없애야 해서 뺀 도메인을 첨부합니다.

사용자 삽입 이미지


뺀 기능이 너무 많아 현재 있는 기능만 보면 다음과 같습니다.

- Clustering
- Web Application(Web Container)
- JMX

위의 것을 남기고 모두 없앴습니다.
- CORBA IIOP
- JMS
- SNMP
- Client Deployer 등등

Attache : Domain Configuration - Server/conf directory




JBoss Slimming EAP4.3

Client Deployer Service

  • Client에서 J2EE를 Deploy할 경우 서비스이며 원격 deploy같은 기능
  • 1. $SERVER_HOME/deploy/client-deployer-service.xml 삭제

JBoss MQ

  • JBoss MQ를 사용하지 않을 경우 제거 가능
  • 1. $SERVER_HOME/deploy/jms 디렉토리 삭제
  • 2. $SERVER_HOME/lib/jbossmq.jar 파일 삭제

JMS Queue/Topic 삭제

  • 1. $SERVER_HOME/conf/jboss-service.xml 파일을 여세요
  • 2. 다음을 주석으로 막아버리세요 jboss.mq:service=DestinationManager

Client User Transaction

  • 클라이언트측에서 서버의 UserTransaction을 얻어가서 안쓸경우
  • 1. $SERVER_HOME/conf/jboss-service.xml파일을 연다
  • 2. jboss:service=ClientUserTransaction 에 주석처리
  • 3. 370라인쯤의 아래를 찾아 주석처리 mbean code="org.jboss.tm.usertx.server.ClientUserTransactionService"
  • 4. $SERVER_HOME/conf/xmdesc/ClientUserTransaction-xmbean.xml을 삭제하거나 편집기로 열어 주석처리

CORBA/IIOP

  • CORBA/IIOP 프로토콜을 사용하지 않을 경우 삭제 가능
  • 1. $SERVER_HOME/conf/jboss-service.xml파일을 연다
  • 2. org.jboss.management.j2ee.LocalJBossServerDomain를 찾아 CorbaORB 애트리뷰트를 주석처리
  • 3. $SERVER_HOME/deploy/iiop-service.xml파일을 삭제하거나 주석처리

Web Service

  • 웹서비스를 사용하지 않을 경우
  • 1. $SERVER_HOME/deploy/jbossws.jar 디렉토리 삭제
  • 2. $SERVER_HOME/conf/standardjboss.xml파일을 연후 org.jboss.ws.server.ServiceEndpointInterceptor 를 주석처리
  • 3. $SERVER_HOME/lib/jboss-saaj.jar & jboss-jaxrpc.jar 삭제

EJB3

  • EJB3를 사용하지 않을 경우 - 삭제할 경우 JMX-console을 사용할 경우 에러남
  • 1. #SERVER_HOME/deploy/ejb3*에 관련된 것을 삭제
  • 2. $SERVER_HOME/lib/ejb3-persistence.jar jboss-ejb3x.jar 삭제

UDDI Service

  • Web Service UDDI를 사용하고 싶지 않을 경우
  • 1. $SERVER_HOME/deploy/juddi-service.sar 디렉토리 삭제

Bean Shell Deployer

  • Shell에서 deploy할 수 있는 모듈을 사용하지 않을 경우
  • 1. $SERVER_HOME/deploy/bsh-deployer.xml을 삭제
  • 2. $SERVER_HOME/lib/bsh* 삭제

UUID Key Generator

  • CMP EJB에서 primary key를 생성하기 위한 것인데 불필요하면 제거
  • 1. $SERVER_HOME/deploy/uuid-key-generator.war 디렉토리를 삭제
  • 2. $SERVER_HOME/lib/autonumber-plugin.jar 파일을 삭제

RMI over HTTP 삭제

  • RMI를 HTTP로 터널링할 필요가 없을 경우에 삭제 가능합니다.
  • 1. default설정일 경우 $SERVER_HOME/deploy/http-invoker.sar디렉토리를 삭제하세요
  • 2. 클러스터 설정일 경우 $SERVER_HOME/deploy/httpha-invoker.sar디렉토리를 삭제하세요

JBoss Messaging

  • JBoss MQ를 사용하지 않을 경우 제거 가능
  • 1. $SERVER_HOME/deploy/jboss-messaging.sar 디렉토리 삭제
  • 2. $SERVER_HOME/lib/jboss-messaging*.jar 파일 삭제

CacheInvalidation Service

  • CMP EJB에서 CacheInvalidation을 사용하지 않을 경우 삭제할 수 있음
  • 1. $SERVER_HOME/deploy/cache-invalidation-service.xml 삭제
  • 주의 : HA Cluster를 사용할 경우 에러 발생할 수 있습니다.

JavaMail

  • 1. $SERVER_HOME/deploy/mail-service.xml 파일 삭제
  • 2. $SERVER_HOME/lib/mail* 삭제
2009. 3. 26. 10:45

[JBOSS/TOMCAT] JBOSS/TOMCAT 에서 심볼릭링크 디렉토리 허용 방법




TOMCAT이야 JSP 컨테이너로 잘 알고 있는 프로그램이고 JBOSS의 경우 Open Source WAS이다. JBOSS 중에서 JSP 컨테이너 부분은 TOMCAT을 사용하고 있다.

둘다 설정 파일 위치만 다르고 동일하기 때문에 이번 쓰래드는 JBOSS/TOMCAT으로 기술한다.

앞으로도 JBOSS와 TOMCAT에 둘다 적용 가능한 부분은 JBOSS/TOMCAT으로 JBOSS만 적용 되는 부분은 JBOSS로 TOMCAT에만 적용 되는 부분은 앞에 TOMCAT을 붙이겠다.

기본적으로 JBOSS/TOMCAT에서는 WEB Application 디렉터리 바깥으로 심볼릭 링크를 허용하지 않는다.
그러나 만약에 허용 하는 경우에는 Context의 allowLinking 값을 true로 설정하는 경우 외부의 심볼릭 링크를 허용하게 된다.

Default Context는 jboss-web.deployer/context.xml(TOMCAT의 경우 server.xml)에서 설정하게 되며, Web Application 별로 설정하고 싶은 경우에는 WEB-INF/context.xml에서 설정하게 된다.

참고로 심볼릭링크를 사용하는 경우 JBOSS나 TOMCAT을 구동하는 사용자가 해당 디렉터리를 읽을 수 잇는 권한이 설정 되어야 한다.

설정 예시

ROOT.war/WEB-INF/context.xml

<Context cookies="true" crossContext="true" allowLinking="true">

   <!-- Session persistence is disable by default. To enable for all web

   apps set the pathname to a non-empty value:

   <Manager pathname="SESSIONS.ser" />

   To enable session persistence for a single web app, add a

   WEB-INF/context.xml

   -->

   <Manager pathname="" />

   <!-- Install an InstanceListener to handle the establishment of the run-as

   role for servlet init/destroy events.

   -->

   <InstanceListener>org.jboss.web.tomcat.security.RunAsListener</InstanceListener>

   

</Context>



참고로 심볼릭 링크 허용은 보안상의 문제를 일으킬 수 있다. 그러므로 Default Context에 설정하기 보다는 필요한 Web Application에만 설정하도록 한다.

그리고 Windows에서는 이를 허용할 경우, JSP 소스가 노출되는 문제가 있으므로 설정해서는 안된다. 

(*) 다큐먼트에 나와있는 주의 사항

NOTE: This flag MUST NOT be set to true on the Windows platform (or any other OS which does not have a case sensitive filesystem), as it will disable case sensitivity checks, allowing JSP source code disclosure, among other security problems.

2009. 3. 19. 15:29

JBoss 한글 처리(다국어 포함) - Encoding Filter




JBoss를 사용하다 한글 처리에 대한 질문을 많이 받고 있습니다. 다국어 지원까지 포함해야 하는 경우도 종종 있습니다.

JBoss에서 한글 처리를 하기 위해서는 2가지의 작업이 필요합니다.

1. Web Application에 filter를 등록하기

첨부하는 파일을 이용하여 web.xml에 Encoding Filter를 등록하도록 합니다.
다음의 내용을 web.xml에 추가합니다.

<filter>
   <filter-name>Set Character Encoding</filter-name>
   <filter-class>filters.SetCharacterEncodingFilter</filter-class>
   <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>Set Character Encoding</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

JBoss level에서 엄격하게 스펙을 적용하는 통에.. 위의 url-pattern은 * 이 아니고 /* 이어야 합니다.

 
2. JBoss의 $SERVER_HOME/deploy/jboss-web.deployer/server.xml 파일을 열어 필요한 Connector 부분에 다음의 attribute를 추가합니다. JBoss의 default encoding은 ISO-8859-1입니다.
<Connector ... URIEncoding="UTF-8"/>

위와 같이 설정하면 다국어 지원까지 가능한 애플리케이션을 만들 수 있습니다.