[WebSphere] ์‹ค์ œ IP(Real IP) ์ธ์‹ ๋ถˆ๊ฐ€ ํ•ด๊ฒฐ: trustedHeaderOrigin ์„ค์ • ๊ฐ€์ด๋“œ (CVE-2012-5783 ๋Œ€์‘)

WebSphere Application Server(WAS)์˜ trustedHeaderOrigin ์„ค์ •์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์ •ํ™•ํ•œ IP๋งŒ ์ž…๋ ฅํ•ด์•ผ ํ–ˆ์œผ๋‚˜, ์ตœ์‹  ํ”ฝ์ŠคํŒฉ(9.0.5.7, 8.5.5.20)๋ถ€ํ„ฐ๋Š” 192.168.*.*์™€ ๊ฐ™์€ IP ์„ธ๊ทธ๋จผํŠธ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์œ ๋™ IP ํ™˜๊ฒฝ์—์„œ์˜ ์„ค์ •๋ฒ•๊ณผ ์ ์šฉ ๋ฒ„์ „์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ์—…๋ฐ์ดํŠธ ๋ฐฐ๊ฒฝ: IP ๊ด€๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ํž˜๋“ค๋‹ค?

๊ธฐ์กด์—๋Š” ๋ณด์•ˆ(CVE-2012-5783) ์ด์Šˆ๋กœ ์ธํ•ด trustedHeaderOrigin์— ์•ž๋‹จ ์›น ์„œ๋ฒ„์˜ ์ •ํ™•ํ•œ IP(Full IP)๋ฅผ ์ผ์ผ์ด ๋“ฑ๋กํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํด๋ผ์šฐ๋“œ(AWS, Azure)๋‚˜ ์ปจํ…Œ์ด๋„ˆ(Docker/K8s) ํ™˜๊ฒฝ์—์„œ๋Š” L4/Web ์„œ๋ฒ„์˜ IP๊ฐ€ ์ˆ˜์‹œ๋กœ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋Œ€์—ญ์œผ๋กœ ํ• ๋‹น๋˜๋ฏ€๋กœ, ๋ชจ๋“  IP๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๋ถ„ ์™€์ผ๋“œ์นด๋“œ(IP Wildcard Segments) ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


2. ์™€์ผ๋“œ์นด๋“œ ์ง€์› ๋ฒ„์ „ (Target Fixpacks)

์•„๋ž˜ ๋ฒ„์ „ ์ด์ƒ์˜ ํ”ฝ์ŠคํŒฉ(Fix Pack)์ด ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ๋Š” IP ๋Œ€์—ญ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ œํ’ˆ๊ตฐ ์ง€์› ์‹œ์ž‘ ๋ฒ„์ „ (Minimum Version)
WAS 9.0 9.0.5.7 ์ด์ƒ
WAS 8.5 8.5.5.20 ์ด์ƒ
Liberty 21.0.0.2 ์ด์ƒ
์ฐธ๊ณ : ์œ„ ๋ฒ„์ „๋ณด๋‹ค ๋‚ฎ์€ ๊ฒฝ์šฐ 192.168.*.* ๊ฐ™์€ ์ž…๋ ฅ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ IP ์ธ์‹์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์„ค์ • ๊ฐ€์ด๋“œ (Configuration)

WAS ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ ์ „์†ก ์ฑ„๋„์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ

  1. Servers > [์„œ๋ฒ„๋ช…] > Web Container Settings > Web container transport chains
  2. ๋Œ€์ƒ ์ฒด์ธ ์„ ํƒ (์˜ˆ: WCInboundDefault)
  3. HTTP Inbound Channel (HTTP_2) > Custom properties > New

์†์„ฑ ๊ฐ’ ์ž…๋ ฅ ์˜ˆ์‹œ (New Feature)

์ด์ œ ์•„๋ž˜์™€ ๊ฐ™์ด ์œ ์—ฐํ•œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์ด๋ฆ„ (Name) ๊ฐ’ (Value) ์˜ˆ์‹œ ์„ค๋ช…
trustedHeaderOrigin

trustedSensitiveHeaderOrigin
10.10.*.* 10.10.0.0/16 ๋Œ€์—ญ์˜ ๋ชจ๋“  IP ์‹ ๋ขฐ (์ถ”์ฒœ)
192.168.1.*, 10.1.*.* ์ฝค๋งˆ(,)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋Œ€์—ญ ๋™์‹œ ์ง€์ •
*.ibm.com ํ˜ธ์ŠคํŠธ๋„ค์ž„ ๊ธฐ๋ฐ˜์˜ ์™€์ผ๋“œ์นด๋“œ ์ง€์›
Best Practice:
๊ณผ๊ฑฐ์—๋Š” ํŽธ์˜์ƒ * (์ „์ฒด ํ—ˆ์šฉ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์œผ๋‚˜, ์ด๋Š” ๋ณด์•ˆ์ƒ ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ๋Š” 10.10.*.* ์ฒ˜๋Ÿผ ๋‚ด๋ถ€๋ง IP ๋Œ€์—ญ๋งŒ ํŠน์ •ํ•˜์—ฌ ํ—ˆ์šฉํ•จ์œผ๋กœ์จ ๋ณด์•ˆ๊ณผ ํŽธ์˜์„ฑ์„ ๋ชจ๋‘ ์ฑ™๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์›น ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ์ธ์‹ ์„ค์ • (ํ•จ๊ป˜ ์ ์šฉ)

IP ๋Œ€์—ญ ์„ค์ •๊ณผ ํ•จ๊ป˜, ํ˜ธ์ŠคํŠธ ํ—ค๋”์˜ ํฌํŠธ ์ •๋ณด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์›น ์ปจํ…Œ์ด๋„ˆ ์„ค์ •๋„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

  • ์œ„์น˜: Web Container > Custom properties
  • ์†์„ฑ: com.ibm.ws.webcontainer.extractHostHeaderPort = true

5. ๊ฒ€์ฆ (Verification)

  1. ์„ค์ • ์ €์žฅ ํ›„ WAS ์žฌ๊ธฐ๋™
  2. SystemOut.log์— ๋ณ„๋‹ค๋ฅธ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ
  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ request.getRemoteAddr() ํ˜ธ์ถœ ์‹œ ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธ

[IHS/WAS] ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP(Real IP) ์‹๋ณ„ ๊ฐ€์ด๋“œ: mod_remoteip ์„ค์ • ๋ฐ ๋ฒ„์ „๋ณ„ ํŒจ์น˜ ํ˜„ํ™ฉ (9.0.5.13)

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(L4/L7) ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด IBM HTTP Server(IHS) 9.0์˜ mod_remoteip๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณด์•ˆ ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด IHS 9.0.5.13 (APAR PH47286) ํŒจ์น˜๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ฒ„์ „๋ณ„ ๋กœ๊ทธ ํฌ๋งท ์„ค์ • ์ฐจ์ด์ ์„ ์ค‘์ ์ ์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ: ์™œ IP๊ฐ€ ๋ฐ”๋€”๊นŒ?

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(Proxy)๋ฅผ ๊ฑฐ์ณ ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋ฉด, ์›น ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•œ ์ฃผ์ฒด๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์ด๋ฏ€๋กœ Source IP๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP(์˜ˆ: 10.0.0.1)๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  • ์ ‘๊ทผ ์ œ์–ด ์‹คํŒจ: IP ๊ธฐ๋ฐ˜์˜ ACL(Access Control List) ์ ์šฉ ๋ถˆ๊ฐ€
  • ๊ฐ์‚ฌ ์ถ”์  ๋ถˆ๊ฐ€: ์‚ฌ๊ณ  ๋ฐœ์ƒ ์‹œ ์‹ค์ œ ๊ณต๊ฒฉ์ž์˜ IP๋ฅผ ๋กœ๊ทธ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Œ

1. ๋ฒ„์ „๋ณ„ ํŒจ์น˜ ๋ฐ ๋กœ๊ทธ ํฌ๋งท ์ฃผ์˜์‚ฌํ•ญ (Version History)

IHS ์„ค์ •์— ์•ž์„œ, ์‚ฌ์šฉ ์ค‘์ธ IHS ๋ฒ„์ „์— ๋”ฐ๋ผ ๋กœ๊ทธ ํฌ๋งท ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์จ์•ผ ํ•˜๋ฏ€๋กœ ๋ฒ„์ „ ํ™•์ธ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“ข ํ•ต์‹ฌ ํŒจ์น˜ ์ •๋ณด: APAR PH47286

์ ์šฉ ๋ฒ„์ „: IBM HTTP Server 9.0.5.13 ์ด์ƒ

๋‚ด์šฉ: ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” mod_remoteip๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•ด๋„, ๊ธฐ๋ณธ ๋กœ๊ทธ ๋ณ€์ˆ˜์ธ %h๊ฐ€ ์—ฌ์ „ํžˆ ํ”„๋ก์‹œ IP๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 9.0.5.13๋ถ€ํ„ฐ๋Š” %h๊ฐ€ mod_remoteip์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ์‹ค์ œ IP๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „๋ณ„ ๊ถŒ์žฅ ๋กœ๊ทธ ํฌ๋งท

IHS ๋ฒ„์ „ Access Log ๊ถŒ์žฅ ๋ณ€์ˆ˜ ์„ค๋ช…
9.0.5.12 ์ดํ•˜ %a (Client IP) %h๋Š” ํ”„๋ก์‹œ IP๋ฅผ ์ฐ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ ๊ธˆ์ง€. ๋ฐ˜๋“œ์‹œ %a ์‚ฌ์šฉ.
9.0.5.13 ์ด์ƒ %h ๋˜๋Š” %a ํŒจ์น˜ ์ ์šฉ๋จ. %h๋ฅผ ์จ๋„ ์‹ค์ œ IP๊ฐ€ ๊ธฐ๋ก๋จ (๊ธฐ์กด ์„ค์ • ์œ ์ง€ ๊ฐ€๋Šฅ).

2. IHS ์„ค์ • ๊ฐ€์ด๋“œ (httpd.conf)

Step 1: ๋ชจ๋“ˆ ํ™œ์„ฑํ™”

# mod_remoteip ๋ชจ๋“ˆ ์ฃผ์„ ํ•ด์ œ
LoadModule remoteip_module modules/mod_remoteip.so

Step 2: ์‹ ๋ขฐํ•  ํ”„๋ก์‹œ ๋“ฑ๋ก

๋ณด์•ˆ์„ ์œ„ํ•ด "๋ˆ„๊ฐ€ ๋ณด๋‚ด์ค€ ํ—ค๋”๋ฅผ ๋ฏฟ์„ ๊ฒƒ์ธ๊ฐ€"๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด ํ—ค๋”๋‚˜ ๋ฏฟ์œผ๋ฉด IP ์Šคํ‘ธํ•‘ ๊ณต๊ฒฉ์— ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<IfModule mod_remoteip.c>
    # 1. ์‹ค์ œ IP๊ฐ€ ๋‹ด๊ธด ํ—ค๋”๋ช… ์ง€์ • (ํ‘œ์ค€: X-Forwarded-For)
    RemoteIPHeader X-Forwarded-For

    # 2. ์‹ ๋ขฐํ•  ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(L4/L7) IP ๋“ฑ๋ก
    # ์‚ฌ์„ค IP ๋Œ€์—ญ์˜ ํ”„๋ก์‹œ์ธ ๊ฒฝ์šฐ (10.x, 192.168.x ๋“ฑ)
    RemoteIPInternalProxy 10.0.0.1 10.0.0.2

    # ๊ณต์ธ IP ๋Œ€์—ญ์˜ ํ”„๋ก์‹œ์ธ ๊ฒฝ์šฐ
    # RemoteIPTrustedProxy 203.0.113.5
</IfModule>

Step 3: ๋กœ๊ทธ ํฌ๋งท ๋ณ€๊ฒฝ (Access Log)

๋ฒ„์ „์— ๊ด€๊ณ„์—†์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ %a ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# [๊ธฐ์กด] common ํฌ๋งท (9.0.5.12 ์ดํ•˜์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)
# LogFormat "%h %l %u %t \"%r\" %>s %b" common

# [๋ณ€๊ฒฝ] %h -> %a ๋กœ ๋ณ€๊ฒฝ (๊ถŒ์žฅ)
LogFormat "%a %l %u %t \"%r\" %>s %b" common

3. ๊ฒ€์ฆ ๋ฐ ๋””๋ฒ„๊น… (Validation)

์„ค์ • ์ ์šฉ ํ›„ ์‹ค์ œ๋กœ ํ—ค๋”๊ฐ€ ์ž˜ ๋ณ€ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ๋กœ ๋กœ๊ทธ๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ์ฐ์–ด๋ด…๋‹ˆ๋‹ค.

# ๋””๋ฒ„๊น…์šฉ ๋กœ๊ทธ ํฌ๋งท ์ •์˜ (์ž‘์—… ํ›„ ์ฃผ์„ ์ฒ˜๋ฆฌ ๊ถŒ์žฅ)
# %{c}a : Connection IP (L4 IP)
# %a    : Client IP (๋ณ€ํ™˜๋œ ์‹ค์ œ IP)
GlobalLog logs/remoteip_debug.log "L4-IP=%{c}a Real-IP=%a XFF-Header=%{X-Forwarded-For}i"

์ •์ƒ ๊ฒฐ๊ณผ ์˜ˆ์‹œ:

L4-IP=10.0.0.1 Real-IP=203.0.113.2 XFF-Header=203.0.113.2
  • L4-IP์—๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP๊ฐ€ ๋‚˜์™€์•ผ ํ•จ
  • Real-IP์—๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž PC์˜ IP๊ฐ€ ๋‚˜์™€์•ผ ํ•จ (์„ฑ๊ณต)

4. WAS(WebSphere) ์ถ”๊ฐ€ ์„ค์ • ํ•„์š” ์—ฌ๋ถ€

IHS์—์„œ mod_remoteip๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜๋ฉด, WAS ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugin)์œผ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ์ด๋ฏธ Source IP๊ฐ€ ๋ณต์›๋œ ์ƒํƒœ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ WAS ์ชฝ์—์„œ๋Š” ๋ณ„๋„์˜ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด request.getRemoteAddr() ํ˜ธ์ถœ ์‹œ ์‹ค์ œ IP๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋‹จ, Plugin ์„ค์ •์˜ TrustedProxyEnable ์†์„ฑ์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

[WebSphere Liberty] DB ์—ฐ๊ฒฐ ์ด์ •๋ฆฌ: Oracle, DB2, MySQL, Tibero ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • ๋ฐ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

IBM WebSphere Liberty์—์„œ ์ฃผ์š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Oracle, DB2, MySQL, Tibero)์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ JDBC ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. adminCenter๋ฅผ ํ™œ์šฉํ•œ ๊ด€๋ฆฌ ํ™˜๊ฒฝ ๊ตฌ์„ฑ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”, ๊ทธ๋ฆฌ๊ณ  restConnector๋ฅผ ์ด์šฉํ•œ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ๊นŒ์ง€์˜ ์ „์ฒด ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ์ „์ œ ์กฐ๊ฑด (Prerequisites)

  • Version: Liberty 25.x ์ด์ƒ ๊ถŒ์žฅ
  • Java: Java 8 (OpenJ9) ๊ธฐ์ค€
  • ํ•„์ˆ˜ ๊ธฐ๋Šฅ(Feature): server.xml์— ์•„๋ž˜ ํ”ผ์ฒ˜๋“ค์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
<featureManager>
    <feature>jdbc-4.3</feature>              <!-- JDBC ํ‘œ์ค€ ์ง€์› -->
    <feature>transportSecurity-1.0</feature> <!-- ์•”ํ˜ธํ™” ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ ์‹œ -->
    <feature>restConnector-2.0</feature>     <!-- ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ API์šฉ -->
    <feature>adminCenter-1.0</feature>       <!-- ๊ด€๋ฆฌ UI ๋ฐ ํ†ตํ•ฉ ๊ด€๋ฆฌ -->
</featureManager>

1. JDBC ๋“œ๋ผ์ด๋ฒ„ ์ค€๋น„ (Driver Setup)

๊ฐ DB ๋ฒค๋”์— ๋งž๋Š” JDBC ๋“œ๋ผ์ด๋ฒ„(JAR ํŒŒ์ผ)๋ฅผ ์ค€๋น„ํ•˜์—ฌ Liberty ๊ณต์šฉ ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

DB ํŒŒ์ผ๋ช… (์˜ˆ์‹œ) ๋‹ค์šด๋กœ๋“œ ์ถœ์ฒ˜
Oracle ojdbc8.jar Oracle MOS ๋˜๋Š” Maven
DB2 db2jcc4.jar DB ์„œ๋ฒ„์˜ /sqllib/java
MySQL mysql-connector-j-8.x.jar Maven Central
Tibero tibero6-jdbc.jar TmaxSoft ํ…Œํฌ๋„ท

๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๋ณต์‚ฌ

๊ด€๋ฆฌ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ${shared.resource.dir}(๊ธฐ๋ณธ๊ฐ’: usr/shared/resources) ํ•˜์œ„์— ๋ฒค๋”๋ณ„ ํด๋”๋ฅผ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

# Oracle ์˜ˆ์‹œ
mkdir -p $WLP_HOME/usr/shared/resources/jdbc/oracle
cp ojdbc8.jar $WLP_HOME/usr/shared/resources/jdbc/oracle/

2. ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜ (Library)

server.xml์—์„œ ์œ„์—์„œ ๋ฐฐ์น˜ํ•œ JAR ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” library ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

<!-- Oracle ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜ -->
<library id="OracleLib">
    <fileset dir="${shared.resource.dir}/jdbc/oracle" includes="ojdbc*.jar"/>
</library>

3. ๋ฐ์ดํ„ฐ์†Œ์Šค ์ •์˜ (DataSource Configuration)

DB๋ณ„๋กœ ์„ค์ • ํƒœ๊ทธ(properties)์™€ ํด๋ž˜์Šค๋ช…์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Case A: Oracle Database

<dataSource id="OracleDS" jndiName="jdbc/oracleDS" statementCacheSize="60">
    <jdbcDriver libraryRef="OracleLib"
                javax.sql.ConnectionPoolDataSource="oracle.jdbc.pool.OracleConnectionPoolDataSource"/>
    <!-- URL ๋ฐฉ์‹ ์—ฐ๊ฒฐ -->
    <properties.oracle URL="jdbc:oracle:thin:@//192.168.0.101:1521/ORCL"
                       user="scott" password="{aes}..." />
    <connectionManager maxPoolSize="50" connectionTimeout="6s"
                       reapTime="300" maxIdleTime="1800"/>
</dataSource>

Case B: IBM DB2

<dataSource id="DB2DS" jndiName="jdbc/db2" isolationLevel="TRANSACTION_READ_COMMITTED">
    <jdbcDriver libraryRef="DB2Lib"
                javax.sql.ConnectionPoolDataSource="com.ibm.db2.jcc.DB2ConnectionPoolDataSource"/>
    <properties.db2.jcc databaseName="SAMPLE" serverName="localhost" portNumber="50000"
                        user="db2inst1" password="{aes}..." />
</dataSource>

Case C: Tibero (Tmax)

๊ตญ์‚ฐ DB์ธ Tibero๋Š” properties ํƒœ๊ทธ๊ฐ€ ๋ณ„๋„๋กœ ์—†์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ์†์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Tibero ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<dataSource id="TiberoDS" jndiName="jdbc/tibero" statementCacheSize="100">
    <jdbcDriver libraryRef="TiberoLib"
                javax.sql.ConnectionPoolDataSource="com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource"/>
    <!-- properties.tibero ํƒœ๊ทธ ์‚ฌ์šฉ -->
    <properties.tibero url="jdbc:tibero:thin:@192.168.0.111:8629:tibero"
                       user="admin" password="{aes}..." />
</dataSource>

4. ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” (Security)

์„ค์ • ํŒŒ์ผ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. securityUtility๋ฅผ ์ด์šฉํ•ด AES๋กœ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

์•”ํ˜ธํ™” ์‹คํ–‰

# ์•”ํ˜ธํ™” ํ‚ค ์ง€์ • (์˜ˆ: passw0rd)
$WLP_HOME/bin/securityUtility encode --encoding=aes --key=passw0rd 'DB_REAL_PASSWORD'
# ๊ฒฐ๊ณผ: {aes}AA6wcy4K2Xm...

ํ‚ค ๋“ฑ๋ก (bootstrap.properties)

์„œ๋ฒ„๊ฐ€ ์•”ํ˜ธ๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‚ค๋ฅผ ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค.

wlp.password.encryption.key=passw0rd

5. ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ (Validation)

์„œ๋ฒ„๋ฅผ ๊ธฐ๋™ํ•œ ํ›„, REST API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์†Œ์Šค ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ํ™•์ธ (Check Point):
ํ•ด๋‹น API๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์›น ๊ด€๋ฆฌ ์ฝ˜์†”(Admin Center)์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” adminCenter-1.0 ๋ฐ restConnector-2.0 ํ”ผ์ฒ˜๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ ‘๊ทผํ•˜๋Š” ๊ณ„์ •์— ๊ด€๋ฆฌ์ž(Administrator) ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ๋ช…๋ น์–ด (curl)

# ๊ด€๋ฆฌ์ž ๊ณ„์ •(admin)์œผ๋กœ ์ธ์ฆ ํ›„ ํ…Œ์ŠคํŠธ API ํ˜ธ์ถœ
curl -k -u admin:passw0rd \
  https://localhost:9443/ibm/api/validation/dataSource/OracleDS

์„ฑ๊ณต ์‹œ: 200 OK์™€ ํ•จ๊ป˜ JSON ์‘๋‹ต ๋‚ด์— "Valid" ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์‹คํŒจ ์‹œ: messages.log ํŒŒ์ผ์—์„œ CWLLG2010E(๋กœ๋“œ ์‹คํŒจ), CWNEN0034E(์—ฐ๊ฒฐ ์‹คํŒจ) ๋“ฑ์˜ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


6. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ClassNotFoundException: library ๊ฒฝ๋กœ ์˜คํƒ€ ๋˜๋Š” JAR ํŒŒ์ผ ๊ถŒํ•œ(755) ํ™•์ธ
  • Connection Timeout: DB ๋ฐฉํ™”๋ฒฝ(Port) ์˜คํ”ˆ ์—ฌ๋ถ€ ํ™•์ธ
  • Authentication Failed: bootstrap.properties์— ์•”ํ˜ธํ™” ํ‚ค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

[WebSphere Liberty] ์„ค์ • ์œ ์—ฐํ™”์˜ ํ•ต์‹ฌ: ๋ณ€์ˆ˜(Variable) ํ™œ์šฉ๋ฒ• ๋ฐ ์šฐ์„ ์ˆœ์œ„ ์™„๋ฒฝ ์ •๋ฆฌ

WebSphere Liberty์˜ ์„ค์ • ํŒŒ์ผ(server.xml)์—์„œ ํฌํŠธ ๋ฒˆํ˜ธ, DB ์ ‘์† ์ •๋ณด ๋“ฑ์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜(Variable)๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. bootstrap.properties์™€ server.xml, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ„์˜ ์šฐ์„ ์ˆœ์œ„ ๊ทœ์น™๊ณผ JDBC URL ์„ค์ • ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์Šฌ๋ž˜์‹œ(/) ์ •๊ทœํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํŒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ณ€์ˆ˜๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?

์„œ๋ฒ„ ์„ค์ •์„ ๋ณ€์ˆ˜ํ™”ํ•˜๋ฉด ํ•˜๋‚˜์˜ server.xml ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋‚˜ ํ™˜๊ฒฝ(Dev/Test/Prod)์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’(ํฌํŠธ, IP ๋“ฑ)๋งŒ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1. ๋ณ€์ˆ˜ ์ •์˜ ์œ„์น˜ ๋ฐ ์šฐ์„ ์ˆœ์œ„ (Precedence)

Liberty์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ ํฌ๊ฒŒ ์„ธ ๊ตฐ๋ฐ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฎ์–ด์”Œ์›Œ์ง‘๋‹ˆ๋‹ค. (์•„๋ž˜์ชฝ์ด ์šฐ์„ ์ˆœ์œ„ ๋†’์Œ)

  1. ํ”„๋กœ์„ธ์Šค ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (OS Environment Variables): ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„
  2. bootstrap.properties: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์”€
  3. server.xml (๋˜๋Š” include ๋œ xml): ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„ (์ตœ์ข… ์Šน์ž)
Best Practice:
์„œ๋ฒ„๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ๊ณ ์œ  ์„ค์ •(์˜ˆ: HTTP ํฌํŠธ)์€ bootstrap.properties์— ์ •์˜ํ•˜๊ณ , ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ณตํ†ต ์„ค์ •(์˜ˆ: DB ์„ค์ •)์€ included xml ํŒŒ์ผ์— ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

2. ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (Usage Guide)

Case A: bootstrap.properties ํ™œ์šฉ

์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ํŒŒ์ผ๋กœ, key=value ํ˜•ํƒœ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# bootstrap.properties
# ํฌํŠธ ๋ฒˆํ˜ธ ์ •์˜
http.port=8080
https.port=9443

Case B: server.xml ํ™œ์šฉ

<variable> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์ •์˜๋œ ๋ณ€์ˆ˜๋ฅผ ${...} ๋ฌธ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<!-- ๋ณ€์ˆ˜ ์ •์˜ (Global) -->
<variable name="http.port" value="8080" />

<!-- ๋ณ€์ˆ˜ ์‚ฌ์šฉ -->
<httpEndpoint id="defaultHttpEndpoint"
              httpPort="${http.port}"
              httpsPort="${https.port}" />

Case C: ํ™˜๊ฒฝ ๋ณ€์ˆ˜(Environment Variable) ํ™œ์šฉ

OS ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” env. ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<!-- OS์˜ LIBRARY_DIR ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ -->
<fileset dir="${env.LIBRARY_DIR}" includes="*.jar"/>

3. ๊ณ ๊ธ‰ ํ™œ์šฉ ํŒ (Advanced Tips)

1) JDBC URL ์Šฌ๋ž˜์‹œ(/) ์ •๊ทœํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ

Liberty ์„ค์ • ํŒŒ์„œ(Parser)๋Š” ๋ณ€์ˆ˜ ๊ฐ’์— ํฌํ•จ๋œ ์—ฐ์†๋œ ์Šฌ๋ž˜์‹œ(//)๋ฅผ ๋‹จ์ผ ์Šฌ๋ž˜์‹œ(/)๋กœ ์ •๊ทœํ™”ํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— JDBC URL ๋“ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…: ๊ฐ’์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์ด์ค‘ ์Šฌ๋ž˜์‹œ๋กœ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

# [Bad] ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด jdbc:db2:/host.com ์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์—๋Ÿฌ ๋ฐœ์ƒ
# DB_URL="jdbc:db2://host.com"

# [Good] ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฒฐํ•ฉ
URL_PART_1="jdbc:db2:"
URL_PART_2="//host.com"
<dataSource ...>
    <properties.db2.jcc url="${URL_PART_1}${URL_PART_2}" />
</dataSource>

2) ๋ฆฌ์ŠคํŠธ(List) ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ

์ฝค๋งˆ(,)๋กœ ๊ตฌ๋ถ„๋œ ๊ฐ’์„ ๋‹จ์ˆœ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๋ฆฌ์ŠคํŠธ๋กœ ์ธ์‹์‹œํ‚ค๋ ค๋ฉด ${list(...)} ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<variable name="ports" value="80,9080"/>

<!-- ๋ฌธ์ž์—ด "80, 9080"์œผ๋กœ ์ธ์‹ -->
<myConfig value="${ports}" /> 

<!-- ๋ฆฌ์ŠคํŠธ ["80", "9080"]์œผ๋กœ ์ธ์‹ -->
<myConfig value="${list(ports)}" />

3) ์‚ฐ์ˆ  ์—ฐ์‚ฐ (Arithmetic)

ํฌํŠธ ์˜คํ”„์…‹ ๋“ฑ์„ ์„ค์ •ํ•  ๋•Œ ๊ฐ„๋‹จํ•œ ์‚ฌ์น™์—ฐ์‚ฐ(+, -, *, /)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

<!-- ๊ธฐ๋ณธ ํฌํŠธ(8080)์— 1์„ ๋”ํ•ด 8081๋กœ ์„ค์ • -->
<httpEndpoint id="secondaryEndpoint" httpPort="${http.port+1}" />

4. ๋ณ€์ˆ˜ ๋ช…๋ช… ๊ทœ์น™ (Naming Convention)

๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ์•ŒํŒŒ๋ฒณ(๋ฌธ์ž)์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฉฐ, ์•„๋ž˜ ๋ฌธ์ž๋“ค๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž (Alphabetic characters)
  • ์ˆซ์ž (Numeric characters)
  • ์–ธ๋”์Šค์ฝ”์–ด (_)
  • ์  (.)

Next Step:
์ด์ œ server.xml์—์„œ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  bootstrap.properties๋กœ ์˜ฎ๊ฒจ๋ณด์‹ญ์‹œ์˜ค. ์ด๋ฅผ ํ†ตํ•ด Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ๋‚˜ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ ๋ฐฐํฌ ์‹œ ์„ค์ • ๊ด€๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[WebSphere] Liberty Performance Tuning: ์ฃผ์š” ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ€์ด๋“œ

Summary: WebSphere Liberty(Open Liberty) ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์กฐ์ • ๊ฐ€๋Šฅํ•œ ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. JVM ํž™ ์„ค์ •๋ถ€ํ„ฐ Connection Pool, Executor, ๊ทธ๋ฆฌ๊ณ  ์œ ํœด ์ž์› ๊ด€๋ฆฌ๊นŒ์ง€ server.xml ๋ฐ jvm.options๋ฅผ ํ†ตํ•œ ํŠœ๋‹ ํฌ์ธํŠธ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

WebSphere Liberty๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๊ฐ€ ํŠœ๋‹(Self-tuning) ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋‚˜, ์šด์˜ ํ™˜๊ฒฝ์˜ ํŠน์„ฑ์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์›Œํฌ๋กœ๋“œ ํŒจํ„ด์— ๋”ฐ๋ผ ๋ช…์‹œ์ ์ธ ์„ค์ • ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ๋ฌธ์„œ๋Š” IBM Documentation์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•ต์‹ฌ ์†์„ฑ๋“ค์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

1. JVM Tuning

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉฐ ์ค‘์š”ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ${server.config.dir}/jvm.options ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ: ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘์„ ์œ„ํ•ด ์ตœ์†Œ ํž™(Min Heap)์€ ์ž‘๊ฒŒ, ์ตœ๋Œ€ ํž™(Max Heap)์€ ํ•„์š”ํ•œ ๋งŒํผ ์„ค์ •.
  • ์šด์˜ ํ™˜๊ฒฝ: ๋Ÿฐํƒ€์ž„ ์ค‘ ํž™ ํฌ๊ธฐ ์กฐ์ •(Expansion/Contraction)์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œ ํž™๊ณผ ์ตœ๋Œ€ ํž™์„ ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

2. Transport Channel Service Tuning

ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ, HTTP I/O ์ฒ˜๋ฆฌ, ์Šค๋ ˆ๋“œ ํ’€ ๋ฐ ์—ฐ๊ฒฐ ํ’€ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. server.xml์—์„œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

HTTP Options

SSL ํ•ธ๋“œ์…ฐ์ดํฌ ๋น„์šฉ์ด ๋†’๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์ง€์†์  ์—ฐ๊ฒฐ(Persistent Connection) ์„ค์ •์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • maxKeepAliveRequests: ๋‹จ์ผ HTTP ์—ฐ๊ฒฐ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜์ž…๋‹ˆ๋‹ค. -1๋กœ ์„ค์ • ์‹œ ๋ฌด์ œํ•œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์—ฐ๊ฒฐ ๋งบ๋Š” ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<httpOptions maxKeepAliveRequests="-1" />

Connection Manager

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€(Connection Pool) ์„ฑ๋Šฅ์„ ๊ฒฐ์ •์ง“๋Š” ํ•ต์‹ฌ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

  • maxPoolSize: ์ตœ๋Œ€ ์‹ค์ œ ์—ฐ๊ฒฐ ์ˆ˜ (Default: 50). ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ DB ์—ฐ๊ฒฐ์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด coreThreads์™€ 1:1 ๋งคํ•‘์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  • purgePolicy: Stale Connection ๋ฐœ๊ฒฌ ์‹œ ์ฒ˜๋ฆฌ ์ •์ฑ…. ๊ธฐ๋ณธ๊ฐ’์€ EntirePool์ด๋‚˜, FailingConnectionOnly๋กœ ์„ค์ •ํ•˜์—ฌ ์‹คํŒจํ•œ ์—ฐ๊ฒฐ๋งŒ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • numConnectionsPerThreadLocal: ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋ณ„๋กœ DB ์—ฐ๊ฒฐ์„ ์บ์‹ฑํ•˜์—ฌ ๋ฝ ๊ฒฝํ•ฉ(Contention)์„ ์ค„์ž…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
<connectionManager id="defaultConnectionManager" 
                   maxPoolSize="40" 
                   purgePolicy="FailingConnectionOnly" 
                   numConnectionsPerThreadLocal="1" />

Note: numConnectionsPerThreadLocal ์‚ฌ์šฉ ์‹œ, maxPoolSize๋Š” (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ ์ˆ˜ × ์Šค๋ ˆ๋“œ๋‹น ์—ฐ๊ฒฐ ์ˆ˜) ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. Data Source Optimization

DB ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ฐ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์ˆ˜์ค€์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Statement Cache

PreparedStatement ์บ์‹ฑ์„ ํ†ตํ•ด ํŒŒ์‹ฑ ๋น„์šฉ์„ ์ค„์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ ํ•œ SQL ๋ฌธ์žฅ ์ˆ˜๋ณด๋‹ค ํฌ๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<dataSource ... statementCacheSize="60" > ... </dataSource>

Isolation Level

๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ๋™์‹œ์„ฑ(Concurrency)์€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. isolationLevel ์†์„ฑ์œผ๋กœ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • TRANSACTION_READ_UNCOMMITTED: ์„ฑ๋Šฅ ์ตœ์ƒ, ๋ฌด๊ฒฐ์„ฑ ์ตœ์ € (Dirty Read ๋ฐœ์ƒ).
  • TRANSACTION_READ_COMMITTED: Dirty Read ๋ฐฉ์ง€.
  • TRANSACTION_REPEATABLE_READ: Dirty/Non-repeatable Read ๋ฐฉ์ง€.
  • TRANSACTION_SERIALIZABLE: ์„ฑ๋Šฅ ์ตœ์ €, ๋ฌด๊ฒฐ์„ฑ ์ตœ์ƒ (์™„์ „ํ•œ ์ง๋ ฌํ™”).

4. Executor (Thread Pool) Tuning

Liberty์˜ Executor๋Š” ์›Œํฌ๋กœ๋“œ์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•˜๋Š” ์ž๊ฐ€ ํŠœ๋‹ ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์›์น™: ํŠน๋ณ„ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์™ธ ์ƒํ™ฉ: ๊ต์ฐฉ ์ƒํƒœ(Deadlock) ํ•ด๊ฒฐ ๋กœ์ง์ด ๊ณผ๋„ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜, ์‹œ์Šคํ…œ ์ž์› ํ•œ๊ณ„๋กœ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ์ œํ•œํ•ด์•ผ ํ•  ๊ฒฝ์šฐ coreThreads ๋ฐ maxThreads๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

5. Reducing Overhead & Startup Time

๋ถˆํ•„์š”ํ•œ CPU ์‚ฌ์ดํด์„ ์ค„์ด๊ณ  ๊ธฐ๋™ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.

Servlet Response Time

WebContainer๊ฐ€ ์ •์  ๋ฆฌ์†Œ์Šค ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด META-INF ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์Šค์บ”ํ•˜๋Š” ๊ณผ์ •์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

<webContainer skipMetaInfResourcesProcessing="true"/>

Idle Server CPU

์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋นˆ๋ฒˆํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/๊ตฌ์„ฑ ํŒŒ์ผ ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ๋ถˆํ•„์š”ํ•˜๋ฏ€๋กœ, ๋ชจ๋‹ˆํ„ฐ๋ง ์ฃผ๊ธฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.

<!-- ์•„์˜ˆ ๋น„ํ™œ์„ฑํ™” (๊ถŒ์žฅ) -->
<applicationMonitor dropinsEnabled="false" updateTrigger="disabled"/>
<config updateTrigger="disabled"/>

<!-- ํ˜น์€ MBean ํŠธ๋ฆฌ๊ฑฐ๋กœ ๋ณ€๊ฒฝ ๋ฐ ํด๋ง ์ฃผ๊ธฐ ์™„ํ™” -->
<applicationMonitor updateTrigger="mbean" pollingRate="60s"/>
<config updateTrigger="mbean" monitorInterval="60s"/>

CDI 1.2 Scanning

CDI 1.2 ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์•„์นด์ด๋ธŒ๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ธฐ๋™ ์†๋„ ์ €ํ•˜์˜ ์ฃผ์›์ธ์ด ๋˜๋ฏ€๋กœ, ์•”์‹œ์  ์Šค์บ”(Implicit Bean Archives)์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

<cdi12 enableImplicitBeanArchives="false"/>

Next Step: ์œ„ ์„ค์ •๋“ค์€ ์›Œํฌ๋กœ๋“œ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ํšจ๊ณผ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์šด์˜ ํ™˜๊ฒฝ ์ ์šฉ ์ „, ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋Ÿ‰(Throughput)๊ณผ ์‘๋‹ต ์‹œ๊ฐ„ ๋ณ€ํ™”๋ฅผ ์ธก์ •ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

[WebSphere] Liberty Cluster: End-to-End ๊ตฌ์ถ• ๋ฐ ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ

Summary: WebSphere Liberty Profile(WLP)์˜ Collective ๋ฐ Cluster ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ ์ธํ”„๋ผ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. Controller ๊ตฌ์„ฑ๋ถ€ํ„ฐ Member ์กฐ์ธ, ํด๋Ÿฌ์Šคํ„ฐ๋ง ์„ค์ • ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…๊นŒ์ง€์˜ ์ „์ฒด ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

WebSphere Application Server Liberty Profile(WLP)์€ ๊ฒฝ๋Ÿ‰ํ™”๋œ ๊ตฌ์กฐ์™€ ํ™•์žฅ์„ฑ ๋•๋ถ„์— ์ฑ„ํƒ๋ฅ ์ด ๋†’์•„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ํฌ์ŠคํŠธ๋Š” WLP Collective์™€ Clustering ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ† ํด๋กœ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•œ ์—”์ง€๋‹ˆ์–ด๋ง ๋…ธํŠธ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • How to Create and Configure WebSphere Liberty Cluster End-to-End (Current)
  • How to Deploy Application in WebSphere Liberty Cluster
  • How to Setup Front-End Web Server for WebSphere Liberty Cluster

1. Topology Architecture

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Collective Controller 1๋Œ€์™€ Collective/Cluster Member 2๋Œ€๋กœ ๊ตฌ์„ฑ๋œ ํ† ํด๋กœ์ง€๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—๋Š” IBM HTTP Server(IHS)๊ฐ€ ๋ฐฐ์น˜๋˜๋ฉฐ ๋ณ„๋„์˜ ๋ฐฐํฌ ์„œ๋ฒ„๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

2. Prerequisites & WLP Installation

๋ณธ ๊ฐ€์ด๋“œ๋Š” WLP 17.0.2 ๋ฐ CentOS Linux 7.3 ํ™˜๊ฒฝ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ์ „ ์ง€์›๋˜๋Š” Java ๋ฒ„์ „์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Check System Environment

$> cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

$> ./java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build pxa6480sr4fp5-20170421_01(SR4 FP5))
IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64 Compressed References 20170419_344392)

Base Installation (Machine: 02)

๋จผ์ € Controller๊ฐ€ ๋  ๋จธ์‹ (Machine: 02)์— WLP๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๋’ค, ์ด๋ฅผ ํŒจํ‚ค์ง•ํ•˜์—ฌ Member ์„œ๋ฒ„๋“ค(Machine: 03, 04)๋กœ ๋ฐฐํฌํ•˜๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# Create directory
$> sudo mkdir -p /opt/ibm

# Change ownership
$> sudo chown -R wasadmin:wasgrp /opt/ibm

# Install WLP
$> java -jar wlp-17.0.0.2-all.jar --acceptLicense /opt/ibm

# Verify version
$> cd /opt/ibm/wlp/bin
$> ./productInfo version
Product name: WebSphere Application Server
Product version: 17.0.0.2

Install Required Features

Collective, Cluster, SSL, JMX Connector ๋“ฑ์˜ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$> ./installUtility install collectiveController-1.0 collectiveMember-1.0 clusterMember-1.0 websocket-1.1 restConnector-2.0 ssl-1.0 localConnector-1.0 adminCenter-1.0

Package and Distribute

์„ค์น˜๋œ ํ™˜๊ฒฝ์„ wlp_install.jar๋กœ ํŒจํ‚ค์ง•ํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

# Create defaultServer for packaging context
$> ./server create

# Package server including all binaries
$> ./server package defaultServer --archive=/tmp/wlp_install.jar --include=all
Server defaultServer package complete in /tmp/wlp_install.jar.

์ƒ์„ฑ๋œ wlp_install.jar๋ฅผ Machine 03, 04๋กœ ์ „์†กํ•œ ํ›„ ๋™์ผํ•˜๊ฒŒ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

# On Machine 03 & 04
$> sudo mkdir -p /opt/ibm
$> chown -R wasadmin:wasgrp /opt/ibm
$> java -jar wlp_install.jar --acceptLicense /opt/ibm

3. Setup Collective Controller (Machine: 02)

Controller ์„œ๋ฒ„(wlpCntlr)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

# Create server
$> ./server create wlpCntlr

# Initialize Collective Controller
$> ./collective create wlpCntlr --keystorePassword=<password> --createConfigFile=/opt/ibm/wlp/usr/servers/wlpCntlr/wlpcntlr_include.xml

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ธ์ฆ์„œ ์ƒ์„ฑ ๋ฐ wlpcntlr_include.xml ์„ค์ • ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ server.xml๊ณผ include ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

Configuration: server.xml (Controller)

<server description="CollectiveController">
    <featureManager>
        <feature>adminCenter-1.0</feature>
        <feature>websocket-1.1</feature>
        <feature>restConnector-1.0</feature>
        <feature>localConnector-1.0</feature>
    </featureManager>

    <!-- Include generated config -->
    <include location="${server.config.dir}/wlpcntlr_include.xml" />

    <httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" host="*" />
</server>

Configuration: wlpcntlr_include.xml

์ž๋™ ์ƒ์„ฑ๋œ ํŒŒ์ผ์—์„œ quickStartSecurity ๋ถ€๋ถ„์„ ๋ณธ์ธ์˜ ๊ณ„์ • ์ •๋ณด๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

<quickStartSecurity userName="wasadmin" userPassword="{xor}EncryptedPassword..." />

Firewall Configuration

CentOS ๋ฐฉํ™”๋ฒฝ์—์„œ 9080, 9443 ํฌํŠธ๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$> sudo firewall-cmd --zone=public --permanent --add-port=9443/tcp
$> sudo firewall-cmd --zone=public --permanent --add-port=9080/tcp
$> sudo firewall-cmd --reload

Start Controller

$> ./server start wlpCntlr

๋กœ๊ทธ(messages.log)์—์„œ CWWKX6011I: The collective controller is ready ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Admin Center(https://hostname:9443/adminCenter/) ์ ‘์†๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. Setup Collective & Cluster Members

Machine 03๊ณผ 04์—์„œ ๋ฉค๋ฒ„ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Controller์— Join ์‹œํ‚ต๋‹ˆ๋‹ค.

Create & Join Member (Machine: 03)

# Create Server
$> ./server create wlpSrv01

# Join Collective
$> ./collective join wlpSrv01 \
  --host=waslibctlr01 \
  --port=9443 \
  --user=wasadmin \
  --password=<password> \
  --keystorePassword=<password> \
  --createConfigFile=/opt/ibm/wlp/usr/servers/wlpSrv01/wlpsrv01_include.xml

SSL Handshake ๊ณผ์ •์—์„œ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•˜๊ฒ ๋ƒ๋Š” ํ”„๋กฌํ”„ํŠธ์— y๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Configuration: server.xml (Member)

Member ์„œ๋ฒ„์˜ server.xml์— Cluster ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ , Controller๊ฐ€ ๋ฐฐํฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก remoteFileAccess๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<server description="Cluster Member">
    <featureManager>
        <feature>webProfile-7.0</feature>
        <feature>restConnector-1.0</feature>
        <feature>localConnector-1.0</feature>
        <!-- Added for Clustering -->
        <feature>clusterMember-1.0</feature>
    </featureManager>

    <include location="${server.config.dir}/wlpsrv01_include.xml" />

    <!-- Define Cluster Name -->
    <clusterMember name="wlpCluster"/>

    <httpEndpoint id="defaultHttpEndpoint" httpPort="9081" httpsPort="9444" host="*" />

    <!-- Write Access for Controller -->
    <remoteFileAccess>
        <writeDir>${server.config.dir}</writeDir>
    </remoteFileAccess>
</server>

Machine: 04 (wlpSrv02)์— ๋Œ€ํ•ด์„œ๋„ ์œ„ ๊ณผ์ •์„ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

Security Considerations (LTPA)

ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ์„ธ์…˜ ๊ณต์œ  ๋ฐ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ๋™์ผํ•œ LTPA ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ltpa.keys ํŒŒ์ผ์„ ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ์„œ๋ฒ„๋“ค์˜ ๋™์ผํ•œ ๊ฒฝ๋กœ(${server.ouput.dir}/resources/security/)๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

5. Start Members & Verification

๊ฐ ๋…ธ๋“œ์—์„œ ๋ฉค๋ฒ„ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

$> ./server start wlpSrv01  # On Machine 03
$> ./server start wlpSrv02  # On Machine 04

๋กœ๊ทธ ํŒŒ์ผ์—์„œ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋“ค์„ ํ™•์ธํ•˜์—ฌ ์ •์ƒ ๊ตฌ๋™์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

  • CWWKX8112I: Collective Repository์— ํ˜ธ์ŠคํŠธ ์ •๋ณด ๊ฒŒ์‹œ ์„ฑ๊ณต.
  • CWWKX7400I: ClusterMember MBean ํ™œ์„ฑํ™” (ํด๋Ÿฌ์Šคํ„ฐ ์กฐ์ธ ์„ฑ๊ณต).

6. Troubleshooting Notes

์„ค์ • ๊ณผ์ •์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • CWWKX0229E (401 Unauthorized / 403 Forbidden)
    collective join ์‹œ ์ธ์ฆ ์‹คํŒจ. quickStartSecurity์˜ ๊ณ„์ • ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. 403 ์—๋Ÿฌ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ administrator-role์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CWWKS9582E (SSL unresolved)
    IIOP ๋ณด์•ˆ ์„ค์ • ์‹œ SSL ์ฐธ์กฐ ์˜ค๋ฅ˜. server.xml์— SSL ๊ตฌ์„ฑ ๋ฐ KeyStore ์ •์˜๊ฐ€ ๋ช…ํ™•ํ•œ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • CWWKO0221E / CWWKS9580E (Port in use)
    ํ•œ ํ˜ธ์ŠคํŠธ์— ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„์šธ ๊ฒฝ์šฐ JMS ํฌํŠธ(7276)๋‚˜ IIOP ํฌํŠธ(2809) ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. wasJmsEndpoint ๋ฐ iiopEndpoint ์„ค์ •์„ ํ†ตํ•ด ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Next Step: ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ด ํด๋Ÿฌ์Šคํ„ฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

[IHS/Liberty] ๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜: X-Powered-By ํ—ค๋” ์ˆจ๊น€ ๋ฐ ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€ ๊ฐ€์ด๋“œ

IBM HTTP Server(IHS)์™€ WebSphere Liberty ํ™˜๊ฒฝ์—์„œ X-Powered-By ํ—ค๋”(์˜ˆ: Servlet/3.1) ๋…ธ์ถœ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์›น ์„œ๋ฒ„(IHS) ๋‹จ์—์„œ์˜ ํ•„ํ„ฐ๋ง๊ณผ WAS(Liberty) ๋‹จ์—์„œ์˜ ์ƒ์„ฑ ๊ธˆ์ง€ ์„ค์ •์„ ๋ชจ๋‘ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์ „๋žต (Context)

๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜ ์‹œ, ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€๋Š” ๋‹ค๊ณ„์ธต ๋ฐฉ์–ด(Defense in Depth)๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ„์ธต ์—ญํ•  ๋ฐ ์ค‘์š”์„ฑ
1. IHS (Web Server) [ํ•„์ˆ˜] ์ตœ์ „๋ฐฉ ๋ฐฉ์–ด์„ . ๋ฐฑ์—”๋“œ WAS๊ฐ€ ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ํด๋ผ์ด์–ธํŠธ๋กœ ๋‚˜๊ฐ€๋Š” ๋ชจ๋“  ์‘๋‹ต์—์„œ ํ—ค๋”๋ฅผ ๊ฐ•์ œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
2. Liberty (WAS) [๊ถŒ์žฅ] ์†Œ์Šค ์ฐจ๋‹จ. ๋‚ด๋ถ€๋ง์—์„œ WAS๋กœ ์ง์ ‘ ์ ‘์†ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ์›น ์„œ๋ฒ„ ์„ค์ •์„ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ํ—ค๋” ์ƒ์„ฑ ์ž์ฒด๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค.

Test Environment

  • Web Server: IBM HTTP Server v9.0 (Apache 2.4 Base)
  • WAS: WebSphere Liberty Core 20.0.x

1. IBM HTTP Server (IHS) ์„ค์ •

Apache ๊ธฐ๋ฐ˜์ธ IHS์—์„œ๋Š” mod_headers ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ํ—ค๋”๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

httpd.conf ์ˆ˜์ •

์„ค์ • ํŒŒ์ผ(httpd.conf)์„ ์—ด์–ด ์•„๋ž˜ ๋‚ด์šฉ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

# 1. ๋ชจ๋“ˆ ๋กœ๋“œ ํ™•์ธ (์ฃผ์„ ํ•ด์ œ ํ•„์ˆ˜)
LoadModule headers_module modules/mod_headers.so

# 2. ํ—ค๋” ์ œ๊ฑฐ ์„ค์ • (Global ์˜์—ญ ๋˜๋Š” VirtualHost ๋‚ด๋ถ€์— ์ž‘์„ฑ)
<IfModule mod_headers.c>
    # ๋ณด์•ˆ ์กฐ์น˜: ๊ธฐ์ˆ  ์Šคํƒ ์ •๋ณด ์ˆจ๊น€
    Header unset X-Powered-By
    
    # (์„ ํƒ) ์ถ”๊ฐ€์ ์ธ ์ •๋ณด ๋…ธ์ถœ ํ—ค๋” ์ฐจ๋‹จ
    Header unset X-AspNet-Version
    Header unset X-Runtime
</IfModule>

# 3. ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด ์ตœ์†Œํ™” (OS ์ •๋ณด ๋“ฑ ์ˆจ๊น€)
ServerTokens Prod
Tip: ์„ค์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ./apachectl -t๋กœ ๋ฌธ๋ฒ•์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์žฌ๊ธฐ๋™(restart ๋˜๋Š” graceful)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. WebSphere Liberty ์„ค์ •

Liberty๋Š” server.xml ํŒŒ์ผ ํ•˜๋‚˜๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์„ค์ •์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. webContainer ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์—ฌ ํ—ค๋” ์ƒ์„ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

server.xml ์ˆ˜์ •

<server description="Liberty Server">

    <!-- Feature Manager (๊ธฐ๋ณธ ์„ค์ •) -->
    <featureManager>
        <feature>servlet-3.1</feature>
    </featureManager>

    <!-- [๋ณด์•ˆ ์กฐ์น˜] X-Powered-By ํ—ค๋” ๋น„ํ™œ์„ฑํ™” ์†์„ฑ ์ถ”๊ฐ€ -->
    <webContainer disableXPoweredBy="true" />

</server>

Liberty๋Š” ๋™์  ์„ค์ •์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํŒŒ์ผ ์ €์žฅ ์‹œ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€๋งŒ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ™•์‹คํ•œ ์ ์šฉ์„ ์œ„ํ•ด ์„œ๋ฒ„ ์žฌ๊ธฐ๋™์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.


3. ๊ฒ€์ฆ (Verification)

curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์น˜ ์ „ํ›„์˜ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

์กฐ์น˜ ์ „ (Before)

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.1
Server: IBM_HTTP_Server/9.0.5...
...

์กฐ์น˜ ํ›„ (After)

curl -I http://localhost:80/
HTTP/1.1 200 OK
Server: IBM_HTTP_Server   <-- (Prod ์„ค์ •์œผ๋กœ ๋ฒ„์ „ ์ˆจ๊น€)
Content-Type: text/html
...                       <-- (X-Powered-By ํ—ค๋” ์‚ญ์ œ๋จ)

Next Step:
ํ—ค๋” ์กฐ์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, HTTP ๋ฉ”์†Œ๋“œ ์ œํ•œ(GET, POST ์™ธ ์ฐจ๋‹จ) ๋ฐ SSL/TLS ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „(TLS 1.2 Only) ์„ค์ •์„ ํ†ตํ•ด ์›น ์„œ๋น„์Šค ๋ณด์•ˆ์„ ํ•œ ๋‹จ๊ณ„ ๋” ๊ฐ•ํ™”ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[WebSphere Liberty] securityUtility๋กœ SSL ์ธ์ฆ์„œ ์ƒ์„ฑ ๋ฐ AES ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ์„ค์ • ๊ฐ€์ด๋“œ

WebSphere Liberty์˜ securityUtility ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด ์„œ๋ช…๋œ(Self-Signed) SSL ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ณด์•ˆ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด Keystore ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ AES๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์‹œ๋‚˜๋ฆฌ์˜ค (Context)

Liberty ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ๋ฐœ ํŽธ์˜๋ฅผ ์œ„ํ•ด SSL ์„ค์ •์„ ์ž๋™ํ™”ํ•˜์ง€๋งŒ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ช…์‹œ์ ์ธ ์ธ์ฆ์„œ ๊ด€๋ฆฌ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์•ˆ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. securityUtility๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฆ์„œ ์ƒ์„ฑ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”(Encoding)๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • Middleware: WebSphere Liberty Profile (WLP)
  • Server Name: s11, s12

1. SSL ์ธ์ฆ์„œ ์ƒ์„ฑ ๋ฐ ์•”ํ˜ธํ™” (Create Certificate)

securityUtility createSSLCertificate ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค์Šคํ† ์–ด(PKCS12)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ --passwordEncoding=aes ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ • ํŒŒ์ผ์— ๋“ค์–ด๊ฐˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ๊ตฌ๋ฌธ

# ๊ตฌ๋ฌธ: securityUtility createSSLCertificate --server=[์„œ๋ฒ„๋ช…] --password=[ํ‚คํŒจ์Šค์›Œ๋“œ] --validity=[์œ ํšจ๊ธฐ๊ฐ„์ผ์ˆ˜] --passwordEncoding=aes --passwordKey=[์•”ํ˜ธํ™”ํ‚ค]

cd $WLP_HOME/bin
./securityUtility createSSLCertificate --server=s11 --password=passw0rd --validity=7300 --passwordEncoding=aes --passwordKey=passw0rd

์‹คํ–‰ ๊ฒฐ๊ณผ

ํ‚ค ์ €์žฅ์†Œ /sw/was/WebSphere/wlp/usr/servers/s11/resources/security/key.p12์„(๋ฅผ) ์ž‘์„ฑํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„ s11์— ๋Œ€ํ•œ SSL ์ธ์ฆ์„œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. 
์ด ์ธ์ฆ์„œ๋Š” CN=testwas11,OU=s11์„(๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ SubjectDN์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Tip: ์—ฌ๊ธฐ์„œ ์ƒ์„ฑ๋œ ํ‚ค์Šคํ† ์–ด ํŒŒ์ผ(key.p12)์€ usr/servers/[์„œ๋ฒ„๋ช…]/resources/security/ ๊ฒฝ๋กœ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

2. ์„œ๋ฒ„ ์„ค์ • ์ ์šฉ (server.xml)

์œ„์—์„œ ์ƒ์„ฑ๋œ ์ธ์ฆ์„œ๋ฅผ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋„๋ก server.xml์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถ€๋ถ„์— {aes}... ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<server description="SSL Server">

    <!-- 1. SSL ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” -->
    <featureManager>
        <feature>transportSecurity-1.0</feature>
    </featureManager>

    <!-- 2. Keystore ์ •์˜ (๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•”ํ˜ธํ™”๋œ ๊ฐ’ ์‚ฌ์šฉ) -->
    <keyStore id="defaultKeyStore" 
              location="key.p12"
              password="{aes}AJS+VEek/Fgo/zp46z8cuIUMTbnMM7sJVmPPbT49n4s6" />

</server>

3. ์•”ํ˜ธํ™” ํ‚ค ๋“ฑ๋ก (bootstrap.properties)

server.xml์— ์ ํžŒ {aes} ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„œ๋ฒ„๊ฐ€ ๋ณตํ˜ธํ™”ํ•˜๋ ค๋ฉด, ์•”ํ˜ธํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ Key๋ฅผ ์„œ๋ฒ„์— ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ bootstrap.properties ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์œ„์น˜: usr/servers/[์„œ๋ฒ„๋ช…]/bootstrap.properties
# securityUtility ์‹คํ–‰ ์‹œ --passwordKey ์˜ต์…˜์— ๋„ฃ์—ˆ๋˜ ๊ฐ’
wlp.password.encryption.key=passw0rd
์ฃผ์˜: ์ด ์„ค์ •์ด ๋ˆ„๋ฝ๋˜๋ฉด ์„œ๋ฒ„ ๊ธฐ๋™ ์‹œ CWWKS1704E: ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

4. ์ธ์ฆ์„œ ๊ฒ€์ฆ (Verification)

์ƒ์„ฑ๋œ ํ‚ค์Šคํ† ์–ด ํŒŒ์ผ์ด ์ •์ƒ์ ์ธ์ง€, ์œ ํšจ๊ธฐ๊ฐ„์€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด JDK์— ํฌํ•จ๋œ keytool ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ ๋ช…๋ น์–ด

# keytool -list -v -keystore [ํŒŒ์ผ๊ฒฝ๋กœ] -storetype PKCS12 -storepass [๋น„๋ฐ€๋ฒˆํ˜ธ]
./keytool -list -v -keystore /sw/was/WebSphere/wlp/usr/servers/s12/resources/security/key.p12 -storetype PKCS12 -storepass passw0rd

์ถœ๋ ฅ ๊ฒฐ๊ณผ ๋ถ„์„

ํ‚ค ์ €์žฅ์†Œ ์œ ํ˜•: PKCS12
ํ‚ค ์ €์žฅ์†Œ ์ œ๊ณต์ž: SUN

๋ณ„์นญ ์ด๋ฆ„: default
์ƒ์„ฑ ๋‚ ์งœ: 2024. 6. 12.
ํ•ญ๋ชฉ ์œ ํ˜•: PrivateKeyEntry
์ธ์ฆ์„œ ์ฒด์ธ ๊ธธ์ด: 2

# ์œ ํšจ๊ธฐ๊ฐ„ ํ™•์ธ
์ ํ•ฉํ•œ ์‹œ์ž‘ ๋‚ ์งœ: Wed Jun 12 16:47:57 KST 2024 
์ข…๋ฃŒ ๋‚ ์งœ: Tue Jun 07 16:47:57 KST 2044 (์•ฝ 20๋…„)

# ์†Œ์œ ์ž ๋ฐ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™•์ธ
์†Œ์œ ์ž: CN=testwas11, OU=s12, O=ibm, C=us
์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„: SHA256withRSA
์ฃผ์ฒด ๊ณต์šฉ ํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜: 2048๋น„ํŠธ RSA ํ‚ค

Next Step:
์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ(Self-Signed)๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” CSR์„ ์ƒ์„ฑํ•˜์—ฌ ๊ณต์ธ ์ธ์ฆ๊ธฐ๊ด€(CA)์˜ ์„œ๋ช…์„ ๋ฐ›์€ ํ›„ keytool -import ๋ช…๋ น์–ด๋กœ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[WebSphere] native_stderr ๋กœ๊ทธ ๋น„๋Œ€ํ™” ํ•ด๊ฒฐ: Verbose GC ๋กœ๊ทธ ๋ถ„๋ฆฌ ๋ฐ ๋กœํ…Œ์ด์…˜ ์„ค์ •

WebSphere์˜ native_stderr.log ํŒŒ์ผ์—๋Š” ๋กœํ…Œ์ด์…˜(Rotation) ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Verbose GC๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ํŒŒ์ผ ์šฉ๋Ÿ‰์ด ๋ฌดํ•œ์ • ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด JVM ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ GC ๋กœ๊ทธ๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ˆœํ™˜์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ์›์ธ ๋ถ„์„ (Root Cause)

WebSphere๋Š” SystemOut.log์™€ SystemErr.log์— ๋Œ€ํ•ด์„œ๋Š” ์‹œ๊ฐ„/ํฌ๊ธฐ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ์ˆœํ™˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, JVM ํ”„๋กœ์„ธ์Šค ์ž์ฒด์˜ ์ถœ๋ ฅ์„ ๋‹ด๋Š” native ๋กœ๊ทธ๋Š” WAS๊ฐ€ ์ œ์–ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ์ : ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ "Verbose garbage collection"์„ ์ฒดํฌํ•˜๋ฉด, GC ์ˆ˜ํ–‰ ๊ธฐ๋ก์ด native_stderr.log์— ๋ˆ„์ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ: ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํŒŒ์ผ์ด GB ๋‹จ์œ„๋กœ ์ปค์ง€๋ฉฐ, ๋””์Šคํฌ Full ์žฅ์• ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7 (3.10.0-957.el7.x86_64)
  • WAS: WebSphere Application Server v8.5 / 9.0
  • JDK: IBM JDK (WebSphere ๊ธฐ๋ณธ)

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: GC ๋กœ๊ทธ ๋ถ„๋ฆฌ ์„ค์ •

ํ•ด๊ฒฐ์˜ ํ•ต์‹ฌ์€ native ๋กœ๊ทธ์— GC ๋‚ด์šฉ์„ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ , ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋นผ๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” JDK ๋ฒค๋”์— ๋”ฐ๋ผ ์˜ต์…˜์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Step 1: ๊ธฐ๋ณธ Verbose GC ๋น„ํ™œ์„ฑํ™”

JVM ์˜ต์…˜์œผ๋กœ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด, ์ฝ˜์†”์˜ ์ฒดํฌ๋ฐ•์Šค ์˜ต์…˜์€ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ๋กœ: ์„œ๋ฒ„ > ์„œ๋ฒ„ ์œ ํ˜• > WebSphere Application Server > [์„œ๋ฒ„๋ช…] > Java ๋ฐ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ > ํ”„๋กœ์„ธ์Šค ์ •์˜ > Java ๊ฐ€์ƒ ๋จธ์‹ 
  • ์กฐ์น˜: Verbose garbage collection ์ฒดํฌ๋ฐ•์Šค ํ•ด์ œ (Uncheck)
Disable Verbose GC Checkbox

[๊ทธ๋ฆผ] ๊ธฐ๋ณธ Verbose GC ์˜ต์…˜ ํ•ด์ œ

Step 2: ์ผ๋ฐ˜ JVM ์ธ์ˆ˜(Generic JVM arguments) ์ถ”๊ฐ€

๊ฐ™์€ ํ™”๋ฉด์˜ Generic JVM arguments ์ž…๋ ฅ๋ž€์— ์•„๋ž˜ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Case A: IBM JDK ์‚ฌ์šฉ ์‹œ (WebSphere ๊ธฐ๋ณธ)

IBM JDK๋Š” -Xverbosegclog ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๋กœํ…Œ์ด์…˜ ๊ทœ์น™์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

# ๊ตฌ๋ฌธ: -Xverbosegclog:[๊ฒฝ๋กœ/ํŒŒ์ผ๋ช…][,X,Y]
# X: ํŒŒ์ผ ๊ฐœ์ˆ˜, Y: ํŒŒ์ผ๋‹น GC ์‚ฌ์ดํด ์ˆ˜

# ์˜ˆ์‹œ 1: ๋‚ ์งœ/PID ํฌํ•จํ•˜์—ฌ ๋‹จ์ผ ํŒŒ์ผ ์ƒ์„ฑ (๊ฐ€์žฅ ์ผ๋ฐ˜์ )
-Xverbosegclog:${SERVER_LOG_ROOT}/gc.%Y%m%d.%H%M%S.%pid.txt

# ์˜ˆ์‹œ 2: 10,000 ์‚ฌ์ดํด๋งˆ๋‹ค ํŒŒ์ผ ๊ต์ฒด, ์ด 10๊ฐœ ํŒŒ์ผ ์œ ์ง€ (๋กœํ…Œ์ด์…˜)
-Xverbosegclog:${SERVER_LOG_ROOT}/verbosegc.log,10,10000

Case B: Oracle/HotSpot JDK ์‚ฌ์šฉ ์‹œ

๋“œ๋ฌผ์ง€๋งŒ Solaris๋‚˜ ํŠน์ • ํ™˜๊ฒฝ์—์„œ HotSpot ๊ณ„์—ด JDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

-verbose:gc
-Xloggc:${SERVER_LOG_ROOT}/verbosegc.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=20M
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
Tip: ${SERVER_LOG_ROOT} ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฒฝ๋กœ ๋Œ€์‹  ๊ฐ ์„œ๋ฒ„์˜ ๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„๊ฐ€๋ฏ€๋กœ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

3. ์ ์šฉ ํ™•์ธ (Verification)

  1. ์„ค์ • ์ €์žฅ ํ›„ ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ps -ef | grep java ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™•์ธํ–ˆ์„ ๋•Œ, ์ถ”๊ฐ€ํ•œ ์˜ต์…˜์ด ์ ์šฉ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ(logs/[์„œ๋ฒ„๋ช…]/)์— gc...txt ๋˜๋Š” ์„ค์ •ํ•œ ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
GC Log File Created

Next Step:
๋ถ„๋ฆฌ๋œ GC ๋กœ๊ทธ ํŒŒ์ผ์€ IBM GCMV (Garbage Collection and Memory Visualizer) ๋„๊ตฌ์— ๋„ฃ์–ด ๋ถ„์„ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ํŠœ๋‹ ํฌ์ธํŠธ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[WebSphere] Log4j ๋ณด์•ˆ ์ทจ์•ฝ์ (Log4Shell) ๊ธด๊ธ‰ ๋Œ€์‘: kc.war ๋ฐ uddi.ear ์กฐ์น˜ ๊ฐ€์ด๋“œ

Apache Log4j ์ทจ์•ฝ์ (CVE-2021-44228 ๋“ฑ)์ด IBM WebSphere Application Server(WAS)์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. WAS 9.0์˜ ๊ด€๋ฆฌ ์ฝ˜์†” ๋„์›€๋ง(kc.war)๊ณผ ์ „ ๋ฒ„์ „์˜ UDDI ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(uddi.ear)์— ํฌํ•จ๋œ ์ทจ์•ฝํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ž„์‹œ ์กฐ์น˜(Mitigation) ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ์˜ํ–ฅ๋ฐ›๋Š” ์ œํ’ˆ ๋ฐ ๋ฒ„์ „ (Affected Products)

์‚ฌ์‹ค์ƒ ํ˜„์žฌ ์šด์˜ ์ค‘์ธ ๋Œ€๋ถ€๋ถ„์˜ WebSphere ๋ฒ„์ „์ด ์ง๊ฐ„์ ‘์ ์ธ ์˜ํ–ฅ๊ถŒ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ œํ’ˆ (Product) ์˜ํ–ฅ ๋ฒ„์ „ (Versions)
WebSphere Application Server (Traditional) 9.0, 8.5, 8.0, 7.0
WebSphere Liberty Continuous Delivery (All)

2. ์ทจ์•ฝ์  ์ƒ์„ธ ๋ฐ ์กฐ์น˜ ๊ฐ€์ด๋“œ (Remediation)

WAS ์—”์ง„ ์ž์ฒด๋ณด๋‹ค๋Š” ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด๋ผ๋ฉด ๊ณผ๊ฐํ•˜๊ฒŒ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Case A: WAS 9.0 - kc.war (๊ด€๋ฆฌ ์ฝ˜์†” ๋„์›€๋ง)

WAS 9.0 ๊ด€๋ฆฌ ์ฝ˜์†”์˜ '๋„์›€๋ง(Knowledge Center)' ๊ธฐ๋Šฅ์— Log4j 2.x ์ทจ์•ฝ ๋ฒ„์ „์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋Œ€์ƒ: WAS 9.0 ์‚ฌ์šฉ์ž
  • ์กฐ์น˜ ๋ฐฉ๋ฒ•: ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ์‚ญ์ œ
# 1. ๋ฐฐํฌ๋œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ๊ฑฐ
rm -f [WAS_HOME]/systemApps/isclite.ear/kc.war/WEB-INF/lib/log4j*.jar

# 2. ์„ค์น˜ ๊ฐ€๋Šฅ ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์›๋ณธ ์•ฑ ์ œ๊ฑฐ (์žฌ์„ค์น˜ ๋ฐฉ์ง€)
rm -rf [WAS_HOME]/installableApps/kc.war

# 3. ์„œ๋ฒ„ ์žฌ๊ธฐ๋™
./stopServer.sh server1 && ./startServer.sh server1
์ฃผ์˜: ํ–ฅํ›„ 9.0.5.11 ์ด์ „์˜ ํ”ฝ์ŠคํŒฉ์„ ์ ์šฉํ•˜๋ฉด ์‚ญ์ œํ•œ ํŒŒ์ผ์ด ๋ณต๊ตฌ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํŒจ์น˜ ํ›„ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Case B: ์ „ ๋ฒ„์ „ - uddi.ear (UDDI ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ)

UDDI(Universal Description, Discovery, and Integration) ์„œ๋น„์Šค์— Log4j ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

  • ๋Œ€์ƒ: WAS 7.0 ~ 9.0 ์ „์ฒด
  • ์กฐ์น˜ ๋ฐฉ๋ฒ•: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํŒŒ์ผ ์‚ญ์ œ
# ๋ฏธ์‚ฌ์šฉ ์‹œ (๊ถŒ์žฅ)
rm -f [WAS_HOME]/installableApps/uddi.ear

# ์‚ฌ์šฉ ์ค‘์ผ ๊ฒฝ์šฐ (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๊ต์ฒด/์‚ญ์ œ ํ›„ ์žฌ๋ฐฐํฌ ํ•„์š”)
# uddi.ear ์••์ถ• ํ•ด์ œ -> log4j*.jar ์‚ญ์ œ -> ๋‹ค์‹œ ์••์ถ• -> Redeploy

3. Log4j 1.x ๊ด€๋ จ ์ถ”๊ฐ€ ์กฐ์น˜ (CVE-2021-4104)

Log4j 1.x ๋ฒ„์ „์€ Log4Shell(RCE) ์ทจ์•ฝ์ ์˜ ์ง์ ‘์ ์ธ ๋Œ€์ƒ์€ ์•„๋‹ˆ์ง€๋งŒ, JMSAppender๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์œ ์‚ฌํ•œ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (WAS ๊ธฐ๋ณธ ์„ค์ •์—๋Š” JMSAppender๊ฐ€ ์—†์œผ๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ)

์กฐ์น˜ ๋ฐฉ๋ฒ• (JMSAppender ์ œ๊ฑฐ)

Log4j 1.x๋Š” ๋” ์ด์ƒ ๋ณด์•ˆ ํŒจ์น˜๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์œผ๋ฏ€๋กœ(EOL), ์ทจ์•ฝํ•œ ํด๋ž˜์Šค ํŒŒ์ผ๋งŒ ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

# ์‹œ์Šคํ…œ ์ „์ฒด์—์„œ log4j-1.2.x.jar ํŒŒ์ผ์„ ์ฐพ์•„ JMSAppender ํด๋ž˜์Šค ์ œ๊ฑฐ
zip -q -d log4j-1.2.17.jar org/apache/log4j/net/JMSAppender.class

4. ์ฐธ๊ณ  ์ž๋ฃŒ (Reference)

Summary:
WAS ์šด์˜ํŒ€์€ kc.war์™€ uddi.ear ๋‚ด์˜ log4j ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ , ๊ฐœ๋ฐœํŒ€์€ ๋ฐฐํฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAR/EAR) ๋‚ด์— ์ทจ์•ฝํ•œ Log4j ๋ฒ„์ „์ด ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ๋นŒ๋“œ ์˜์กด์„ฑ์„ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[WebSphere] ๋ณด์•ˆ ๊ฐ์‚ฌ ๋Œ€์‘: NCSA Access Log ํ™œ์„ฑํ™” ๋ฐ ๋กœ๊ทธ ํฌ๋งท(User-Agent, Time) ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

WebSphere v8.5 ํ™˜๊ฒฝ์—์„œ ๋ณด์•ˆ ๊ฐ์‚ฌ ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์œ„ํ•ด NCSA Access Log๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ „์—ญ ์„ค์ •๊ณผ ์ „์†ก ์ฒด์ธ(Transport Chain)๋ณ„ ์„ค์ •์„ ๋ชจ๋‘ ์ ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, accessLogFormat ์†์„ฑ์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ IP, ์ˆ˜ํ–‰ ์‹œ๊ฐ„, User-Agent ๋“ฑ์„ ๊ธฐ๋กํ•˜๋„๋ก ํฌ๋งท์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ํ•„์š”์„ฑ (Context)

WAS ์•ž๋‹จ์— ์›น ์„œ๋ฒ„(Web Server)๊ฐ€ ์žˆ๋‹ค๋ฉด ์›น ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๋˜์ง€๋งŒ, WAS๋กœ ์ง์ ‘ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์ด๋‚˜ ๋‚ด๋ถ€ ํ†ต์‹ , ํ˜น์€ ์ƒ์„ธํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ๋ถ„์„์„ ์œ„ํ•ด์„œ๋Š” WAS ์ž์ฒด์˜ Access Log๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. WebSphere๋Š” NCSA ํ‘œ์ค€ ํฌ๋งท์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • Version: WebSphere Application Server v8.5

1. ์ „์—ญ ๋กœ๊น… ์„œ๋น„์Šค ํ™œ์„ฑํ™” (Global Setting)

๊ฐ€์žฅ ๋จผ์ € ์„œ๋ฒ„ ์ฐจ์›์—์„œ ๋กœ๊น… ์„œ๋น„์Šค๋ฅผ ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ Servers > Server Types > WebSphere application servers > [์„œ๋ฒ„๋ช…] ํด๋ฆญ
  2. ์šฐ์ธก ํ•˜๋‹จ์˜ Troubleshooting ์„น์…˜์—์„œ NCSA access and HTTP error logging ํด๋ฆญ
  3. ์„ค์ • ์ฒดํฌ:
    • Enable logging service at server start-up (์„œ๋ฒ„ ๊ธฐ๋™ ์‹œ ์„œ๋น„์Šค ํ™œ์„ฑํ™”)
    • Enable access logging (์•ก์„ธ์Šค ๋กœ๊น… ํ™œ์„ฑํ™”)
NCSA Logging Global Setting

2. ์ „์†ก ์ฒด์ธ๋ณ„ ๋กœ๊น… ํ™œ์„ฑํ™” (Chain Setting)

์ „์—ญ ์„ค์ •์„ ํ–ˆ๋”๋ผ๋„, ์‹ค์ œ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ์ „์†ก ์ฒด์ธ(Transport Chain)์—์„œ ๋กœ๊น…์„ ์ผœ์ง€ ์•Š์œผ๋ฉด ๋กœ๊ทธ๊ฐ€ ๋‚จ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ(9080, 9443 ๋“ฑ)์— ํ•ด๋‹นํ•˜๋Š” ์ฒด์ธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ

[์„œ๋ฒ„๋ช…] > Web Container Settings > Web container transport chains

์„ค์ • ๋ฐฉ๋ฒ•

์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ฒด์ธ(WCInboundDefault, HttpQueueInboundDefault ๋“ฑ)์„ ์„ ํƒํ•˜์—ฌ ์•„๋ž˜ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฒด์ธ ์ด๋ฆ„ ํด๋ฆญ (์˜ˆ: WCInboundDefault)
  2. HTTP inbound channel (HTTP_2) ํด๋ฆญ
  3. Enable logging ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ
Chain Selection Enable Logging Checkbox
Tip: HTTPS(SSL) ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋„ ๋‚จ๊ธฐ๋ ค๋ฉด WCInboundDefaultSecure ์ฒด์ธ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ๋กœ๊ทธ ํฌ๋งท ์ปค์Šคํ„ฐ๋งˆ์ด์ง• (Custom Properties)

๊ธฐ๋ณธ ํฌ๋งท(Common Log Format)์€ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด๋‚˜ ์„ธ์…˜ ID, User-Agent ๋“ฑ์„ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์ถ”๊ฐ€ ์œ„์น˜

์œ„์˜ HTTP inbound channel (HTTP_2) ์„ค์ • ํ™”๋ฉด์—์„œ ์šฐ์ธก์˜ Custom properties (์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ) ๋ฉ”๋‰ด๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’ (Key & Value)

  • Name: accessLogFormat
  • Value: (์•„๋ž˜ ์˜ˆ์‹œ ์ค‘ ์„ ํƒ)
# ์˜ˆ์‹œ 1: ํ‘œ์ค€ ํ™•์žฅ ํฌ๋งท (IP, ์‹œ๊ฐ„, ์š”์ฒญ, ์ƒํƒœ, ํฌ๊ธฐ, ์ˆ˜ํ–‰์‹œ๊ฐ„)
%h %u %t "%r" %s %b %D

# ์˜ˆ์‹œ 2: ์ „์ฒด ์ •๋ณด ํฌํ•จ (Referer, User-Agent, SessionID ํฌํ•จ)
%h %u %t "%r" %s %b %D "%{Referer}i" "%{User-agent}i" %{JSESSIONID}C
Custom Properties List

Setting accessLogFormat

4. ์ฃผ์š” ํฌ๋งท ์ง€์‹œ์–ด ์„ค๋ช…

์ง€์‹œ์–ด ์„ค๋ช…
%h ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ (Host)
%t ์š”์ฒญ ์‹œ๊ฐ„ (Time)
%r ์š”์ฒญ ๋ผ์ธ (Request Line) - Method, URI, Protocol
%s ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ (Status Code, ์˜ˆ: 200, 404, 500)
%D ์š”์ฒญ ์ฒ˜๋ฆฌ ์†Œ์š” ์‹œ๊ฐ„ (๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„, ์„ฑ๋Šฅ ๋ถ„์„ ์‹œ ์ค‘์š”)
%{Header}i ํŠน์ • ์š”์ฒญ ํ—ค๋” ๊ฐ’ (์˜ˆ: %{User-Agent}i)
%{Cookie}C ํŠน์ • ์ฟ ํ‚ค ๊ฐ’ (์˜ˆ: %{JSESSIONID}C)

Next Step:
๋ชจ๋“  ์„ค์ •์„ ๋งˆ์นœ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ํ•ด์•ผ ๋กœ๊ทธ๊ฐ€ ๋‚จ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. logs/[์„œ๋ฒ„๋ช…]/http_access.log ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

[WebSphere] TLS 1.2 ์ „ํ™˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋ฒ„์ „๋ณ„ ์ง€์› ํ˜„ํ™ฉ ๋ฐ WAS/IHS/Plugin ํ•„์ˆ˜ ์„ค์ •

WebSphere Application Server v7.0, v8.0, v8.5 ํ™˜๊ฒฝ์—์„œ TLS 1.2 ํ”„๋กœํ† ์ฝœ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์š”๊ตฌ ์‚ฌํ•ญ(Fix Pack, JDK)์„ ํ™•์ธํ•˜๊ณ , WAS, IHS, Plugin ๊ฐ ๊ณ„์ธต๋ณ„ ํ•„์ˆ˜ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—ฐ๊ฒฐ ์‹œ ๋ฐœ์ƒํ•˜๋Š” GSK_ERROR_SOCKET_CLOSED ์—๋Ÿฌ ํ•ด๊ฒฐ๋ฒ•์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฒ„์ „๋ณ„ TLS 1.2 ์ง€์› ํ˜„ํ™ฉ (Prerequisites)

TLS 1.2๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด WAS ๋ฒ„์ „์— ๋”ฐ๋ฅธ ์ตœ์†Œ ํ”ฝ์ŠคํŒฉ(Fix Pack)๊ณผ JDK ๋ฒ„์ „์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

WAS Version Minimum Fix Pack Required SDK Version
v7.0 7.0.0.23 ์ด์ƒ SDK 6 SR10 FP1 ์ด์ƒ
v8.0 8.0.0.3 ์ด์ƒ SDK 6.0.1 (J9 2.6) SR1 FP1 ์ด์ƒ
v8.5 8.5.0.0 (๊ธฐ๋ณธ ์ง€์›) SDK 6.0.1 (J9 2.6) SR2 ์ด์ƒ
์ฃผ์˜ (v7.0 ์ œํ•œ์‚ฌํ•ญ):
WAS v7.0์€ Java ๋ ˆ๋ฒจ์—์„œ๋Š” TLS 1.2๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” Web Server Plugin(GSKit V7 ์‚ฌ์šฉ)์€ TLS 1.2๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ v7.0 ํ™˜๊ฒฝ์—์„œ ์›น ์„œ๋ฒ„ ์—ฐ๋™ ๊ตฌ๊ฐ„๊นŒ์ง€ TLS 1.2๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด Plugin ๋ชจ๋“ˆ ์—…๊ทธ๋ ˆ์ด๋“œ ํ˜น์€ ์•„ํ‚คํ…์ฒ˜ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. WAS ์„ค์ • (Application Server)

๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ SSL ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ด€๋ฆฌ ๋ช…๋ น(stop/sync) ์ˆ˜ํ–‰์„ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์„ค์ • ํŒŒ์ผ๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) ๊ด€๋ฆฌ ์ฝ˜์†” ์„ค์ • (QoP)

Security > SSL certificate and key management > SSL configurations ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. CellDefaultSSLSettings, NodeDefaultSSLSettings ๋“ฑ ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ์„ค์ •์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

  1. ์„ค์ • ์ด๋ฆ„ ํด๋ฆญ (์˜ˆ: CellDefaultSSLSettings)
  2. ์šฐ์ธก์˜ Quality of protection (QoP) settings ํด๋ฆญ
  3. Protocol ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ TLSv1.2 ์„ ํƒ
  4. ์ €์žฅ (Save)

2) ssl.client.props ์ˆ˜์ • (์ค‘์š”)

์ด ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด WAS๊ฐ€ TLS 1.2๋กœ ์ „ํ™˜๋œ ํ›„, stopNode๋‚˜ syncNode ๊ฐ™์€ ๊ด€๋ฆฌ ๋ช…๋ น์–ด๊ฐ€ ๊ตฌํ˜• ํ”„๋กœํ† ์ฝœ๋กœ ํ†ต์‹ ์„ ์‹œ๋„ํ•˜์—ฌ ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ๋Œ€์ƒ ํŒŒ์ผ:
    • [PROFILE_HOME]/properties/ssl.client.props
# ํŒŒ์ผ ๋‚ด ํ•ด๋‹น ๋ผ์ธ ์ˆ˜์ •
com.ibm.ssl.protocol=TLSv1.2

3) ์žฌ๊ธฐ๋™ ๋ฐ ๋™๊ธฐํ™”

์„ค์ • ์ ์šฉ์„ ์œ„ํ•ด DMGR๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.

# 1. ๋…ธ๋“œ ๋ฐ DMGR ์ค‘์ง€
./stopNode.sh
./stopManager.sh

# 2. DMGR ๊ธฐ๋™
./startManager.sh

# 3. ๋…ธ๋“œ ๋™๊ธฐํ™” (์ˆ˜๋™ ๋™๊ธฐํ™” ๊ถŒ์žฅ)
./syncNode.sh [Dmgr_Host] [Dmgr_SOAP_Port] -username [ID] -password [PW]

# 4. ๋…ธ๋“œ ๊ธฐ๋™
./startNode.sh

3. Web Server (IHS) ์„ค์ •

IBM HTTP Server์˜ httpd.conf ํŒŒ์ผ์—์„œ SSL ์„ค์ •์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

<VirtualHost *:443>
    SSLEnable
    
    # TLS 1.2 ํ™œ์„ฑํ™”
    SSLProtocolEnable TLSv12
    
    # ์ทจ์•ฝํ•œ ํ•˜์œ„ ํ”„๋กœํ† ์ฝœ ๋น„ํ™œ์„ฑํ™”
    SSLProtocolDisable SSLv2 SSLv3 TLSv10 TLSv11
</VirtualHost>

4. Plugin ์„ค์ • (Troubleshooting)

WAS์™€ IHS๋ฅผ ๋ชจ๋‘ TLS 1.2๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ๋„ http_plugin.log์— GSK_ERROR_SOCKET_CLOSED (gsk rc = 420) ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์—ฐ๊ฒฐ์ด ์•ˆ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์•ˆ ์ˆ˜์ค€์„ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: StrictSecurity ์ ์šฉ

plugin-cfg.xml ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ Config ํƒœ๊ทธ์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<Config StrictSecurity="true">
    <Log LogLevel="Error" Name="..." />
    ...
</Config>
Tip: StrictSecurity="true" ์„ค์ •์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด WAS์™€ ํ†ต์‹ ํ•  ๋•Œ TLS ํ”„๋กœํ† ์ฝœ์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ค€์ˆ˜ํ•˜๋„๋ก ๊ฐ•์ œํ•˜์—ฌ, TLS 1.2 ํ•ธ๋“œ์‰์ดํฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

5. ๊ฒ€์ฆ (Verification)

openssl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ TLS 1.2๋งŒ ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

# TLS 1.2 ์ ‘์† ์„ฑ๊ณต ํ™•์ธ
openssl s_client -connect [Host]:9443 -tls1_2

# TLS 1.0 ์ ‘์† ์‹คํŒจ ํ™•์ธ (ํ•ธ๋“œ์‰์ดํฌ ์—๋Ÿฌ๊ฐ€ ๋‚˜์•ผ ์ •์ƒ)
openssl s_client -connect [Host]:9443 -tls1

[WebSphere Liberty] installUtility ์‚ฌ์šฉ๋ฒ• ์™„๋ฒฝ ๊ฐ€์ด๋“œ: Feature ๊ฒ€์ƒ‰, ๋‹ค์šด๋กœ๋“œ ๋ฐ ๋กœ์ปฌ ์ €์žฅ์†Œ ๊ตฌ์„ฑ

WebSphere Liberty์˜ ๊ธฐ๋Šฅ(Feature)์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ ๋„๊ตฌ์ธ installUtility์˜ ํ•ต์‹ฌ ์‚ฌ์šฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ IBM ์ €์žฅ์†Œ์—์„œ ๊ธฐ๋Šฅ์„ ๊ฒ€์ƒ‰/๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์‚ฌ๋‚ด ํ์‡„๋ง ํ™˜๊ฒฝ์„ ์œ„ํ•œ ๋กœ์ปฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(Local Repository) ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Middleware: IBM Liberty Core 20.0.0.6
  • Tool: installUtility (Located in $WLP_HOME/bin)

1. Feature ๊ฒ€์ƒ‰ ๋ฐ ๋‹ค์šด๋กœ๋“œ (Basic Usage)

IBM์˜ ๊ณต์ธ ์ €์žฅ์†Œ(IBM WebSphere Liberty Repository)์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ฐพ๊ฑฐ๋‚˜ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๊ฒ€์ƒ‰ (Find)

์„ค์น˜ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์˜ ์ •ํ™•ํ•œ ์ด๋ฆ„์„ ๋ชจ๋ฅผ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

# ๊ตฌ๋ฌธ: installUtility find [๊ฒ€์ƒ‰์–ด]
installUtility find jsp --type=feature

๊ธฐ๋Šฅ ๋‹ค์šด๋กœ๋“œ (Download)

์„œ๋ฒ„์— ๋ฐ”๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ , ํŒŒ์ผ(ESA) ํ˜•ํƒœ๋กœ ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋“ค์€ ๋‚˜์ค‘์— ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

# ๊ตฌ๋ฌธ: installUtility download [๊ธฐ๋Šฅ๋ช…] --location=[๊ฒฝ๋กœ]
installUtility download jsp-2.3 --location=/SW/img/LibertyUtility --acceptLicense

2. ๋กœ์ปฌ ์ €์žฅ์†Œ ๊ตฌ์„ฑ (Repository Configuration)

์ธํ„ฐ๋„ท์ด ์ฐจ๋‹จ๋œ ์„œ๋ฒ„๋‚˜, ์‚ฌ๋‚ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ €์žฅ์†Œ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์œ„์น˜

Liberty ์„ค์น˜ ๊ฒฝ๋กœ ๋‚ด์˜ etc ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„์น˜: ${wlp.install.dir}/etc/repositories.properties

์„ค์ • ๋‚ด์šฉ (repositories.properties)

๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„๋‘” Feature ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ๋ฅผ url๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

# Local Repository Path Configuration
# ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ ๋˜๋Š” ์‚ฌ๋‚ด ์›น ์„œ๋ฒ„ URL ์ง€์ • ๊ฐ€๋Šฅ
local-rep.url=/SW/img/LibertyUtility
Tip: useDefaultRepository=false ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด IBM ๊ณต์ธ ์ €์žฅ์†Œ ์ ‘์†์„ ์ฐจ๋‹จํ•˜๊ณ  ๋กœ์ปฌ ์ €์žฅ์†Œ๋งŒ ๋ฐ”๋ผ๋ณด๊ฒŒ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์„ค์ • ๊ฒ€์ฆ (Verification)

์ž‘์„ฑํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์ด ์ •์ƒ์ ์œผ๋กœ ์ธ์‹๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํ™•์ธ (viewSettings)

ํ˜„์žฌ ์ ์šฉ๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ชฉ๋ก๊ณผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

installUtility viewSettings

(์ถœ๋ ฅ ๊ฒฐ๊ณผ์—์„œ local-rep.url์ด ๋ชฉ๋ก์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ)

์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ (testConnection)

์ง€์ •ํ•œ ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์ตœ์ข… ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

# ํŠน์ • ์ €์žฅ์†Œ ํ…Œ์ŠคํŠธ
installUtility testConnection local-rep

# ๋˜๋Š” ์ „์ฒด ํ…Œ์ŠคํŠธ
installUtility testConnection --all

4. ์ฐธ๊ณ  ์ž๋ฃŒ (References)

  • IBM Knowledge Center: installUtility command reference
  • IBM Fix Central: Download Liberty Features (Offline)
    (Fix Central์—์„œ wlp-featureRepo ํŒจํ‚ค์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ์ „์ฒด ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

Next Step:
๋กœ์ปฌ ์ €์žฅ์†Œ ๊ตฌ์„ฑ์ด ๋๋‚ฌ๋‹ค๋ฉด, installUtility install [๊ธฐ๋Šฅ๋ช…] ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ์—†์ด๋„ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์„œ๋ฒ„์— ์ฆ‰์‹œ ์„ค์น˜ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[WebSphere] WAS v9.0 CLI ์„ค์น˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: IM, WAS, IHS, Plugin ๋ฐ JDK 8 ๋™์‹œ ์„ค์น˜

CentOS 7 ํ™˜๊ฒฝ์—์„œ GUI ์—†์ด imcl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WebSphere v9.0.5.1์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. v9.0๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ ์ •์ฑ…์— ๋”ฐ๋ผ JDK 8์„ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์„ค์น˜ํ•ด์•ผ ํ•จ์„ ๊ฐ•์กฐํ•˜๋ฉฐ, WAS, IHS, Plugin ์„ค์น˜ ๋ฐ ํŒจ์น˜ ์ ์šฉ ๋ช…๋ น์–ด๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7 (3.10.0-957.el7.x86_64)
  • Installer: IBM Installation Manager (IM) 1.8.x ์ด์ƒ
  • Target Version: WebSphere Application Server 9.0.5.1

1. Installation Manager (IM) ์„ค์น˜

IBM ์ œํ’ˆ๊ตฐ์„ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ธ IM์„ ๋จผ์ € ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. -repositories์—๋Š” repository.config ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ๋ช…๋ น์–ด

# ์„ค์น˜ ๊ฒฝ๋กœ๋กœ ์ด๋™
cd /sw/img/im

# IM ์„ค์น˜ ์‹คํ–‰
./imcl install com.ibm.cic.agent \
-repositories "/sw/img/im/repository.config" \
-installationDirectory "/sw/IBM/InstallationManager/eclipse" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-showProgress -sP
Tip (ํŒจํ‚ค์ง€ ID ํ™•์ธ):
์„ค์น˜ํ•˜๋ ค๋Š” ์ œํ’ˆ์˜ ์ •ํ™•ํ•œ ID(์˜ˆ: com.ibm.websphere...)๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ์„ค์น˜ ๋ฏธ๋””์–ด ๋‚ด์˜ Offerings ํด๋”๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ./imcl listAvailablePackages -repositories [๊ฒฝ๋กœ] ๋ช…๋ น์–ด๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. WebSphere Application Server (WAS) ์„ค์น˜

์ค‘์š”: WAS v9.0์€ ๊ธฐ๋ณธ JDK๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ com.ibm.websphere.BASE... ํŒจํ‚ค์ง€์™€ com.ibm.java.jdk.v8... ํŒจํ‚ค์ง€๋ฅผ ๋™์‹œ์— ์ง€์ •ํ•˜์—ฌ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ๋ช…๋ น์–ด (Base + JDK 8)

์„ค์น˜ ๋„๊ตฌ(tools) ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

cd /sw/IBM/InstallationManager/eclipse/tools

# WAS ๋ฐ JDK ๋™์‹œ ์„ค์น˜
./imcl install com.ibm.websphere.BASE.v90_9.0.5001.20190828_0616 \
com.ibm.java.jdk.v8_8.0.5041.20190924_1031 \
-repositories "/sw/img/base","/sw/img/sdk" \
-installationDirectory "/sw/was/AppServer9" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-properties cic.selector.nl=ko \
-showProgress -sP

Fix Pack ์—…๋ฐ์ดํŠธ (Optional)

์„ค์น˜ ํ›„ ํŠน์ • ํ”ฝ์ŠคํŒฉ(์˜ˆ: 9.0.5.3)์œผ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

./imcl install com.ibm.websphere.BASE.v90_9.0.5003.20200226_0941 \
-repositories "/sw/img/fixwas" \
-installationDirectory "/sw/was/AppServer9" \
-acceptLicense -sP

3. IBM HTTP Server (IHS) ์„ค์น˜

์›น ์„œ๋ฒ„์ธ IHS๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ JDK ์„ค์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. user.ihs.httpPort ์†์„ฑ์œผ๋กœ ๊ธฐ๋ณธ ํฌํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# IHS ๋ฐ JDK ๋™์‹œ ์„ค์น˜
./imcl install com.ibm.websphere.IHS.v90_9.0.5001.20190828_0616 \
com.ibm.java.jdk.v8_8.0.5041.20190924_1031 \
-repositories "/sw/img/ihs","/sw/img/sdk" \
-installationDirectory "/sw/web/IHS9" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-properties user.ihs.httpPort="80" \
-showProgress -sP

4. Web Server Plugin (PLG) ์„ค์น˜

WAS์™€ ์›น ์„œ๋ฒ„๋ฅผ ์—ฐ๋™ํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

# Plugin ๋ฐ JDK ๋™์‹œ ์„ค์น˜
./imcl install com.ibm.websphere.PLG.v90_9.0.5001.20190828_0616 \
com.ibm.java.jdk.v8_8.0.5041.20190924_1031 \
-repositories "/sw/img/plg","/sw/img/sdk" \
-installationDirectory "/sw/web/Plugins9" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-showProgress -sP

5. ์„ค์น˜ ๊ฒ€์ฆ (Verification)

๋ชจ๋“  ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก๊ณผ ์ƒ์„ธ ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก ํ™•์ธ

# IM ๋ช…๋ น์–ด๋กœ ํ™•์ธ
./imcl listInstalledPackages

์ƒ์„ธ ๋ฒ„์ „ ๋ฆฌํฌํŠธ ํ™•์ธ

WAS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ์ƒ์„ธ ๋ฆฌํฌํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

# WAS ํ™ˆ์˜ bin ๋””๋ ‰ํ† ๋ฆฌ
/sw/was/AppServer9/bin/versionInfo.sh

Next Step:
์—”์ง„ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ manageprofiles.sh ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๊ตฌ๋™ํ•  ํ”„๋กœํŒŒ์ผ(Profile)์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[WebSphere/IHS] ๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜: Server ํ—ค๋” ์ˆจ๊ธฐ๊ธฐ ๋ฐ ๋ฒ„์ „ ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€ ์ „๋žต

HTTP ์‘๋‹ต ํ—ค๋”์˜ Server ํ•„๋“œ(์˜ˆ: Apache/2.4, WebSphere Application Server/8.5)๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์˜ ์ข…๋ฅ˜์™€ ๋ฒ„์ „์ด ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•ž๋‹จ์˜ IBM HTTP Server(IHS)์™€ ๋’ท๋‹จ์˜ WebSphere(WAS) ์–‘์ชฝ ๋ชจ๋‘์˜ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์›์ธ (Context)

์„œ๋ฒ„์˜ ๊ตฌ์ฒด์ ์ธ ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜๋ฉด, ํ•ด์ปค๋Š” ํ•ด๋‹น ๋ฒ„์ „์— ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (CVE)์„ ์ฐพ์•„ ๋งž์ถคํ˜• ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด์•ˆ ๋ชจ๋ฒ” ์‚ฌ๋ก€(Best Practice)์—์„œ๋Š” ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์ตœ์†Œํ™”ํ•  ๊ฒƒ์„ ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTP Server (Apache ๊ธฐ๋ฐ˜)
  • WAS: WebSphere Application Server v8.5

1. IBM HTTP Server (Web Server) ์„ค์ •

๊ฐ€์žฅ ์•ž๋‹จ์—์„œ ์š”์ฒญ์„ ๋ฐ›๋Š” ์›น ์„œ๋ฒ„์˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. httpd.conf ํŒŒ์ผ์— ์•„๋ž˜ ์ง€์‹œ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๋‚ด์šฉ (httpd.conf)

# 1. ์„œ๋ฒ„ ์ •๋ณด ์ตœ์†Œํ™” (Apache/x.y.z -> Apache)
ServerTokens Prod

# 2. ์—๋Ÿฌ ํŽ˜์ด์ง€ ํ•˜๋‹จ(Footer)์— ์„œ๋ฒ„ ์ •๋ณด ์ˆจ๊น€
ServerSignature Off

# 3. Server ํ—ค๋” ์ž์ฒด๋ฅผ ์‘๋‹ต์—์„œ ์ œ๊ฑฐ (IHS ์ „์šฉ ๊ธฐ๋Šฅ, ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ๊ถŒ์žฅ)
AddServerHeader Off
Tip: AddServerHeader Off๋Š” ํ‘œ์ค€ Apache์—๋Š” ์—†๊ณ  IBM HTTP Server์—๋งŒ ์กด์žฌํ•˜๋Š” ์ง€์‹œ์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์šฉ ํ›„ Syntax Error๊ฐ€ ๋‚œ๋‹ค๋ฉด ServerTokens Prod๊นŒ์ง€๋งŒ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.

2. WebSphere (WAS) ์„ค์ •

WAS๊ฐ€ ์ง์ ‘ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ์ค„ ๋•Œ ๋ถ™๋Š” ํ—ค๋”๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. WAS v8.5.0.2 ์ด์ƒ๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜, ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด HTTP ์ „์†ก ์ฑ„๋„(Transport Channel) ์„ค์ •์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ

์„œ๋ฒ„ > WebSphere Application Server > [์„œ๋ฒ„๋ช…] > ์›น ์ปจํ…Œ์ด๋„ˆ ์„ค์ • > ์›น ์ปจํ…Œ์ด๋„ˆ ์ „์†ก ์ฒด์ธ > WCInboundDefault > HTTP ์ธ๋ฐ”์šด๋“œ ์ฑ„๋„ (HTTP_2) > ์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ (Custom properties)

์ฃผ์š” ์†์„ฑ (ํƒ 1)

์ƒํ™ฉ์— ๋งž์ถฐ ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์ด๋ฆ„ (Name) ์„ค๋ช… ๋ฐ ๊ถŒ์žฅ ๊ฐ’
RemoveServerHeader ๊ฐ’: true
Server ํ—ค๋” ์ž์ฒด๋ฅผ ์•„์˜ˆ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์„ค์ •์ž…๋‹ˆ๋‹ค.
ServerHeaderValue ๊ฐ’: (์ž„์˜์˜ ๋ฌธ์ž์—ด)
๊ธฐ๋ณธ๊ฐ’์ธ "WebSphere Application Server..." ๋Œ€์‹  ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด(์˜ˆ: "AppServer")๋กœ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ  (WebContainer ์†์„ฑ):
์ „์†ก ์ฑ„๋„ ์„ค์ • ์™ธ์—๋„, ์›น ์ปจํ…Œ์ด๋„ˆ > ์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ์—์„œ com.ibm.ws.webcontainer.disableServerHeader ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. (์ตœ์‹  ๋ฒ„์ „์—์„œ ๊ถŒ์žฅ)

3. ๊ฒ€์ฆ (Verification)

IHS์™€ WAS๋ฅผ ๋ชจ๋‘ ์žฌ๊ธฐ๋™ํ•œ ํ›„, curl ๋ช…๋ น์–ด๋กœ ์‘๋‹ต ํ—ค๋”๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

# ํ—ค๋” ํ™•์ธ
curl -I http://localhost/

# [Before]
HTTP/1.1 200 OK
Server: IBM_HTTP_Server/8.5 ...
...

# [After] 
HTTP/1.1 200 OK
# Server ํ—ค๋”๊ฐ€ ์•„์˜ˆ ์—†๊ฑฐ๋‚˜ "Apache" ๋˜๋Š” ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ํ‘œ์‹œ๋จ
...

Next Step:
ํ—ค๋” ์ˆจ๊น€ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” HTTP ๋ฉ”์†Œ๋“œ(PUT, DELETE, TRACE) ์ฐจ๋‹จ ์„ค์ •์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ๋ง‰๋Š” ์›น ์„œ๋ฒ„ ๊ฐ•ํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[WebSphere] ๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜: X-Powered-By ๋ฐ Server ํ—ค๋” ์ˆจ๊ธฐ๊ธฐ ์„ค์ •

์›น ์„œ๋ฒ„ ์‘๋‹ต ํ—ค๋”์— ํฌํ•จ๋œ X-Powered-By ์ •๋ณด(์˜ˆ: Servlet/3.1)๋Š” ๋ถˆํ•„์š”ํ•œ ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. IBM WebSphere Application Server(WAS) v8.5 ์ด์ƒ์—์„œ ์›น ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ํ†ตํ•ด ์ด ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์›์ธ (Context)

๊ธฐ๋ณธ์ ์œผ๋กœ WAS๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ณด๋‚ผ ๋•Œ, ์ž์‹ ์ด ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ  ์Šคํƒ์„ ํ—ค๋”์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • X-Powered-By: ๊ตฌํ˜„ ๊ธฐ์ˆ  ์ •๋ณด (์˜ˆ: Servlet/3.0, JSP/2.2)
  • Server: ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด ์ •๋ณด (์˜ˆ: WebSphere Application Server/8.5)

๊ณต๊ฒฉ์ž๋Š” ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํŠน์ • ๋ฒ„์ „์— ์กด์žฌํ•˜๋Š” ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (CVE)์„ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ˆจ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • WAS: WebSphere Application Server v8.5.5

1. X-Powered-By ํ—ค๋” ์ œ๊ฑฐ ์„ค์ •

WAS ๊ด€๋ฆฌ ์ฝ˜์†”(Admin Console)์—์„œ ์›น ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ

์„œ๋ฒ„(Servers) > ์„œ๋ฒ„ ์œ ํ˜•(Server Types) > WebSphere application servers > [์„œ๋ฒ„๋ช…] > ์›น ์ปจํ…Œ์ด๋„ˆ ์„ค์ •(Web Container Settings) > ์›น ์ปจํ…Œ์ด๋„ˆ(Web container) > ์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ(Custom properties)

์†์„ฑ ์ถ”๊ฐ€ (New)

์ด๋ฆ„ (Name) ๊ฐ’ (Value)
com.ibm.ws.webcontainer.disablexPoweredBy true
Tip (Server ํ—ค๋”๋„ ๊ฐ™์ด ์ˆจ๊ธฐ๊ธฐ):
๋ณด์•ˆ ๊ฐ•๋„๋ฅผ ๋” ๋†’์ด๋ ค๋ฉด com.ibm.ws.webcontainer.disableServerHeader ์†์„ฑ๋„ true๋กœ ์„ค์ •ํ•˜์—ฌ WAS ๋ฒ„์ „ ์ •๋ณด๊นŒ์ง€ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฒ€์ฆ (Verification)

์„ค์ • ์ €์žฅ ํ›„ ์„œ๋ฒ„๋ฅผ ๋ฐ˜๋“œ์‹œ ์žฌ๊ธฐ๋™ํ•ด์•ผ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. curl ๋ช…๋ น์–ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(F12)๋ฅผ ํ†ตํ•ด ์‘๋‹ต ํ—ค๋”๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ํ™•์ธ (Linux)

# -I ์˜ต์…˜์œผ๋กœ ํ—ค๋”๋งŒ ์กฐํšŒ
curl -I http://localhost:9080/

# ์ ์šฉ ์ „ (๋…ธ์ถœ๋จ)
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0
Content-Type: text/html
...

# ์ ์šฉ ํ›„ (์‚ฌ๋ผ์ง)
HTTP/1.1 200 OK
Content-Type: text/html
...

๋ธŒ๋ผ์šฐ์ € ํ™•์ธ

Chrome ๊ฐœ๋ฐœ์ž ๋„๊ตฌ > Network ํƒญ > ์•„๋ฌด ์š”์ฒญ ํด๋ฆญ > Response Headers ์„น์…˜์—์„œ ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์‚ฌ๋ผ์กŒ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


Next Step:
WAS ์„ค์ •๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•ž๋‹จ์˜ ์›น ์„œ๋ฒ„(IHS/Apache)์—์„œ๋„ ServerTokens Prod ์„ค์ •์„ ํ†ตํ•ด Apache ๋ฒ„์ „ ์ •๋ณด ๋…ธ์ถœ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ์™„๋ฒฝํ•œ ๋ณด์•ˆ ์กฐ์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

[WebSphere] Liberty Profile & Eclipse ์—ฐ๋™ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ (WDT ์„ค์น˜)

IBM WebSphere Liberty Profile(WLP)์„ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ธ Eclipse์— ์—ฐ๋™ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ๋””๋ฒ„๊น… ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. IBM WebSphere Developer Tools(WDT) ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ๋ฐ ์„œ๋ฒ„ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ ๊ณผ์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: Windows 10
  • IDE: Eclipse IDE for Enterprise Java Developers (2020-06 ์ด์ƒ ๊ถŒ์žฅ)
  • Middleware: WebSphere Liberty Profile (Kernel or Core)

1. ์‚ฌ์ „ ์ค€๋น„ (Prerequisites)

Liberty ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Java SDK์™€ Eclipse๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • JDK: 1.8 ์ด์ƒ ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(JAVA_HOME) ์„ค์ •.
  • Eclipse: 'Eclipse IDE for Enterprise Java and Web Developers' ํŒจํ‚ค์ง€ ์‚ฌ์šฉ ๊ถŒ์žฅ.

2. WebSphere Developer Tools (WDT) ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

Eclipse์—์„œ Liberty ์„œ๋ฒ„๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ์ ˆ์ฐจ

  1. Eclipse ๋ฉ”๋‰ด์—์„œ Help > Eclipse Marketplace...๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฒ€์ƒ‰์ฐฝ์— IBM Liberty ๋˜๋Š” WebSphere Developer Tools๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  3. "IBM Liberty Developer Tools" ํ•ญ๋ชฉ์„ ์ฐพ์•„ Install ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ผ์ด์„ ์Šค ๋™์˜ ํ›„ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ, ์™„๋ฃŒ ํ›„ Eclipse๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

3. Liberty ๋Ÿฐํƒ€์ž„(Runtime) ๋“ฑ๋ก

์ด๋ฏธ ์„ค์น˜๋œ Liberty Core๋ฅผ Eclipse์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, Eclipse๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๋“ฑ๋ก ๊ณผ์ •

  1. Servers ๋ทฐ์—์„œ ์šฐํด๋ฆญ > New > Server ์„ ํƒ.
  2. ์„œ๋ฒ„ ํƒ€์ž…์—์„œ IBM > WebSphere Liberty ์„ ํƒ.
  3. Server's host name์€ localhost, Server name์€ ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ์ด๋ฆ„ ์ž…๋ ฅ.
  4. Runtime Environment ์„ค์ • ๋‹จ๊ณ„:
    • ๊ธฐ์กด ์„ค์น˜๋œ ๊ฒฝ์šฐ: 'Choose an existing installation' ์„ ํƒ ํ›„ Liberty ์„ค์น˜ ๊ฒฝ๋กœ(wlp ํด๋”) ์ง€์ •.
    • ์ƒˆ๋กœ ์„ค์น˜ํ•  ๊ฒฝ์šฐ: 'Install from an archive or a repository' ์„ ํƒ ํ›„ ์›ํ•˜๋Š” ๋ฒ„์ „ ๋‹ค์šด๋กœ๋“œ.
  5. Finish๋ฅผ ํด๋ฆญํ•˜์—ฌ ์„ค์ •์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

4. ์„œ๋ฒ„ ๊ตฌ๋™ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด Eclipse ๋‚ด์—์„œ ์„œ๋ฒ„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ œ์–ด

  • Start: Servers ๋ทฐ์—์„œ ์„œ๋ฒ„ ์šฐํด๋ฆญ > Start (๋˜๋Š” Debug).
  • Console ํ™•์ธ: CWWKF0011I: The server defaultServer is ready to run a smarter planet. ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋ฉด ์ •์ƒ ๊ตฌ๋™๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ

  1. Dynamic Web Project ์ƒ์„ฑ.
  2. ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ > Run As > Run on Server.
  3. ๋“ฑ๋กํ•œ Liberty ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•˜๊ณ  Finish.
  4. server.xml์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋ฉฐ ๋ฐฐํฌ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

5. ์ฐธ๊ณ  ์˜์ƒ (Reference Video)

์‹ค์ œ ์„ค์น˜ ๋ฐ ๊ตฌ๋™ ๊ณผ์ •์— ๋Œ€ํ•œ ๋ฐ๋ชจ ์˜์ƒ์ž…๋‹ˆ๋‹ค.


Next Step:
๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, server.xml ํŒŒ์ผ์˜ <featureManager> ์„น์…˜์„ ์ˆ˜์ •ํ•˜์—ฌ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ(JSP, Servlet, JDBC ๋“ฑ)์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[Linux/Java] High CPU ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: OS ์Šค๋ ˆ๋“œ์™€ Java ์Šค๋ ˆ๋“œ ๋งคํ•‘ ๋ถ„์„ ๊ฐ€์ด๋“œ

Java ํ”„๋กœ์„ธ์Šค(JVM)๊ฐ€ ๊ณ ๋ถ€ํ•˜ ์ƒํƒœ์ผ ๋•Œ, CPU๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ฒ”์ธ(ํŠน์ • ์Šค๋ ˆ๋“œ)์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. OS ๋ช…๋ น์–ด(ps, top)๋กœ ๋ฌธ์ œ์˜ ์Šค๋ ˆ๋“œ ID(TID)๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ์ด๋ฅผ 16์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Java Thread Dump์™€ ๋งคํ•‘ํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Test Environment

  • OS: RedHat Linux (CentOS ํ˜ธํ™˜)
  • Target: Java Process (WebSphere/Tomcat ๋“ฑ)

1. ํ”„๋กœ์„ธ์Šค ๋ฐ ์Šค๋ ˆ๋“œ ์‹๋ณ„ (Identify Usage)

๋จผ์ € CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” Java ํ”„๋กœ์„ธ์Šค์˜ PID(Process ID)๋ฅผ ์ฐพ๊ณ , ๊ทธ ๋‚ด๋ถ€์—์„œ ์‹ค์ œ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๋Š” ์Šค๋ ˆ๋“œ(LWP, Light Weight Process)๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ํ”„๋กœ์„ธ์Šค ํ™•์ธ

# Java ํ”„๋กœ์„ธ์Šค PID ํ™•์ธ
ps -ef | grep java

์Šค๋ ˆ๋“œ๋ณ„ CPU ์ ์œ ์œจ ํ™•์ธ (top)

-H ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์˜ ์Šค๋ ˆ๋“œ ๋‹จ์œ„๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

# PID๊ฐ€ 12345์ธ ๊ฒฝ์šฐ
top -H -p 12345

์ถœ๋ ฅ ํ™”๋ฉด์—์„œ PID(์‹ค์ œ๋กœ๋Š” TID/LWP) ์ปฌ๋Ÿผ๊ณผ %CPU ์ปฌ๋Ÿผ์„ ํ™•์ธํ•˜์—ฌ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๋ณ„ CPU ์ ์œ ์œจ ํ™•์ธ (ps)

ps ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ๋„ ์Šค๋ ˆ๋“œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -lmT ์˜ต์…˜์ด๋‚˜ -L ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# LWP(Light Weight Process) ํ™•์ธ
ps -lmT [PID]

# ๋˜๋Š” ์ปค์Šคํ…€ ํฌ๋งท ์‚ฌ์šฉ
ps -eLo pid,lwp,pcpu,comm | grep [PID]

2. ์Šค๋ ˆ๋“œ ID ๋ณ€ํ™˜ (Decimal to Hex)

OS์—์„œ ํ™•์ธํ•œ ์Šค๋ ˆ๋“œ ID๋Š” 10์ง„์ˆ˜(Decimal)์ด์ง€๋งŒ, Java Thread Dump ํŒŒ์ผ(Javacore ๋“ฑ)์—์„œ๋Š” ์Šค๋ ˆ๋“œ ID๊ฐ€ 16์ง„์ˆ˜(Hexadecimal)๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งคํ•‘์„ ์œ„ํ•ด ๋ณ€ํ™˜ ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜ ์˜ˆ์‹œ

  • OS TID: 9091 (10์ง„์ˆ˜)
  • Hex TID: 0x2383 (16์ง„์ˆ˜)

๋ณ€ํ™˜ ๋ช…๋ น์–ด

# ์‰˜์—์„œ ๋ฐ”๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ (์˜ˆ: 9091 -> 2383)
printf '%x\n' 9091

3. ์Šค๋ ˆ๋“œ ๋คํ”„ ์ƒ์„ฑ ๋ฐ ๋ถ„์„ (Thread Dump)

ํ˜„์žฌ JVM์˜ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ ๋คํ”„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋คํ”„ ์ƒ์„ฑ (Kill -3)

kill -3 ์‹œ๊ทธ๋„์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ํ‘œ์ค€ ์ถœ๋ ฅ(stdout)์ด๋‚˜ ๋กœ๊ทธ ํŒŒ์ผ๋กœ ์Šค๋ ˆ๋“œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

kill -3 [PID]
  • IBM JDK (WebSphere): javacore.YYYYMMDD.HHMMSS.pid.txt ํŒŒ์ผ ์ƒ์„ฑ
  • Oracle/Open JDK: catalina.out ๋˜๋Š” ์ง€์ •๋œ ๋กœ๊ทธ ํŒŒ์ผ์— ์ถœ๋ ฅ

๋กœ๊ทธ ๋งคํ•‘ ๋ถ„์„

์ƒ์„ฑ๋œ ๋คํ”„ ํŒŒ์ผ์—์„œ ์•ž์„œ ๋ณ€ํ™˜ํ•œ 16์ง„์ˆ˜ ๊ฐ’(์˜ˆ: 0x2383)์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. IBM JDK์˜ ๊ฒฝ์šฐ nid(Native ID) ๋˜๋Š” native_thread_id ํ•ญ๋ชฉ๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค.

/* Javacore ์˜ˆ์‹œ */
"WebContainer : 5" (TID:0x12345600, sys_thread_t:0x789abc00, state:R, native ID:0x2383) prio=5
    at com.example.MyClass.infiniteLoop(MyClass.java:45)
    at ...

๋ถ„์„ ํฌ์ธํŠธ:

  1. 16์ง„์ˆ˜ ID๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ(Runnable, Waiting ๋“ฑ)๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. Stack Trace๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์–ด๋–ค ์ฝ”๋“œ(๋ฉ”์†Œ๋“œ)๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํŒŒ์•…ํ•˜์—ฌ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

Next Step:
์ฃผ๊ธฐ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์š”ํ•˜๋‹ค๋ฉด top -H์™€ jstack์„ ๊ฒฐํ•ฉํ•œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ, CPU ์ž„๊ณ„์น˜ ์ดˆ๊ณผ ์‹œ ์ž๋™์œผ๋กœ ๋คํ”„๋ฅผ ๋‚จ๊ธฐ๋„๋ก ์ž๋™ํ™”ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[WebSphere] ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…(Directory Listing) ์ œ๊ฑฐ ๋ฐ ๋ณด์•ˆ ์„ค์ • (directoryBrowsingEnabled)

์›น ์„œ๋ฒ„๊ฐ€ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ธŒ๋ผ์šฐ์ €์— ๋…ธ์ถœํ•˜๋Š” '๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…' ์ทจ์•ฝ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ WebSphere ์„ค์ • ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ(xml) ์ˆ˜์ • ๋ฐฉ์‹๊ณผ ๊ด€๋ฆฌ ์ฝ˜์†”(Admin Console)์„ ํ†ตํ•œ ์ „์—ญ ์„ค์ • ๋ฐฉ์‹์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์›์ธ (Context)

๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์„œ๋ฒ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์™€ ํŒŒ์ผ ๋ชฉ๋ก(๋ฐฑ์—… ํŒŒ์ผ, ์†Œ์Šค ์ฝ”๋“œ ๋“ฑ)์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด 2์ฐจ ๊ณต๊ฒฉ์˜ ๋นŒ๋ฏธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

WebSphere๋Š” ์ •์  ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ fileServingEnabled ์†์„ฑ๊ณผ ๋ชฉ๋ก ๋…ธ์ถœ์„ ์œ„ํ•œ directoryBrowsingEnabled ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ ์ ˆํžˆ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTPServer v8.5.0.0
  • WAS: WebSphere Application Server v8.5

1. Method A: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •

๊ฐœ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์œ„๋กœ ์„ค์ •์„ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. WAR/EAR ํŒŒ์ผ ๋‚ด๋ถ€์˜ IBM ํ™•์žฅ ์„ค์ • ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ๋Œ€์ƒ

  • WAS v7.0 ์ด์ƒ: ibm-web-ext.xml
  • WAS v6.1 ์ดํ•˜: ibm-web-ext.xmi (Legacy)

์„ค์ • ๋‚ด์šฉ (ibm-web-ext.xml)

enable-directory-browsing ์†์„ฑ์„ false๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<web-ext
    xmlns="http://websphere.ibm.com/xml/ns/javaee/web-ext/1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee/web-ext/1.0 http://websphere.ibm.com/xml/ns/javaee/web-ext/1.0/web-ext.xsd">

    <!-- ์ •์  ํŒŒ์ผ ์„œ๋น™ ํ™œ์„ฑํ™” (์ด๋ฏธ์ง€, HTML ๋“ฑ) -->
    <enable-file-serving value="true"/>
    
    <!-- ํ•ต์‹ฌ: ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ… ๋น„ํ™œ์„ฑํ™” -->
    <enable-directory-browsing value="false"/>

</web-ext>

2. Method B: ์›น ์ปจํ…Œ์ด๋„ˆ(Web Container) ์ „์—ญ ์„ค์ •

WAS ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ ์„œ๋ฒ„ ๋‹จ์œ„๋กœ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ  ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ

์„œ๋ฒ„(Servers) > ์„œ๋ฒ„ ์œ ํ˜•(Server Types) > WebSphere application servers > [์„œ๋ฒ„๋ช…] > ์›น ์ปจํ…Œ์ด๋„ˆ ์„ค์ •(Web Container Settings) > ์›น ์ปจํ…Œ์ด๋„ˆ(Web container) > ์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ(Custom properties)

์ฃผ์š” ์†์„ฑ ๊ฐ’

์•„๋ž˜ ์†์„ฑ์„ ์ƒˆ๋กœ ์ž‘์„ฑ(New)ํ•˜์—ฌ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„ (Name) ๊ฐ’ (Value) ์„ค๋ช…
directoryBrowsingEnabled false ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. (๋ณด์•ˆ ํ•„์ˆ˜)
fileServingEnabled true WAS๊ฐ€ ์ •์  ํŒŒ์ผ(html, img ๋“ฑ)์„ ์ฒ˜๋ฆฌํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. (false ์„ค์ • ์‹œ ์ •์  ํŒŒ์ผ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ)
์ฐธ๊ณ : fileServingEnabled๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…๋„ ์ฐจ๋‹จ๋˜์ง€๋งŒ, WAS๊ฐ€ ์ด๋ฏธ์ง€๋‚˜ CSS ๊ฐ™์€ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ „ํ˜€ ์ œ๊ณตํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” directoryBrowsingEnabled๋งŒ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

3. ๊ฒ€์ฆ (Verification)

  1. ์„ค์ • ์ ์šฉ ํ›„ WAS ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ €์—์„œ index.html์ด ์—†๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ(์˜ˆ: http://domain/images/)๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  3. 403 Forbidden ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ณด์•ˆ ์„ค์ •์ด ์ •์ƒ์ ์œผ๋กœ ์ ์šฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[WebSphere] Liberty Core ์„ค์น˜ ๋ฐ ํ•„์ˆ˜ ์„ค์ • ๊ฐ€์ด๋“œ (CLI Install, server.xml, Plugin)

IBM WebSphere Liberty Core๋ฅผ GUI ์—†์ด Command Line(CLI) ํ™˜๊ฒฝ์—์„œ ์„ค์น˜ํ•˜๊ณ , ์„œ๋ฒ„ ์ƒ์„ฑ ๋ฐ ๊ธฐ๋™, ํ•ต์‹ฌ ์„ค์ •(server.xml, JVM), ๊ทธ๋ฆฌ๊ณ  ์›น ์„œ๋ฒ„ ์—ฐ๋™์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒ์„ฑ(pluginUtility) ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ์ œํ’ˆ ์„ค์น˜ (CLI Mode)

Liberty๋Š” Installation Manager(IM)์˜ imcl ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. GUI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฆฌ๋ˆ…์Šค/์œ ๋‹‰์Šค ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ํ•„์ˆ˜์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์„ค์น˜ ๋ช…๋ น์–ด (imcl)

-repositories ์˜ต์…˜์—๋Š” ์„ค์น˜ ํŒŒ์ผ(Repository)์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฝค๋งˆ(,)๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ WAS์™€ JDK ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋™์‹œ์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์„ค์น˜ ์˜ˆ์‹œ (Windows ๊ธฐ์ค€, Linux๋Š” ๊ฒฝ๋กœ๋งŒ ๋ณ€๊ฒฝ)
imcl install com.ibm.websphere.liberty.v85_8.5.16002.20160526_2338 \
com.ibm.websphere.liberty.IBMJAVA.v80_8.0.3020.20161124_1304 \
-repositories "D:\Liberty\16.0.0.2-WS-LIBERTY-CORE,D:\work_file\was_install\v8.5.5\SDK\8.0.3.20" \
-installationDirectory "F:\app\IBM\wlpcore\AppServer" \
-acceptLicense \
-showProgress -sP
Tip: ํŒจํ‚ค์ง€ ID(com.ibm...)๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์šฐ imcl listAvailablePackages -repositories [๊ฒฝ๋กœ] ๋ช…๋ น์–ด๋กœ ๋ฏธ๋ฆฌ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ์„œ๋ฒ„ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ (Server Lifecycle)

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด bin ๋””๋ ‰ํ† ๋ฆฌ์˜ server ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

1) ์„œ๋ฒ„ ์ƒ์„ฑ (Create)

cd [WLP_HOME]/bin
# ๊ตฌ๋ฌธ: server create [์„œ๋ฒ„๋ช…]
server.bat create test01

์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด [WLP_HOME]/usr/servers/test01 ๊ฒฝ๋กœ์— ์„ค์ • ํŒŒ์ผ๋“ค์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

2) ์„œ๋ฒ„ ๊ธฐ๋™ ๋ฐ ์ƒํƒœ ํ™•์ธ (Start/Status)

# ์„œ๋ฒ„ ๊ธฐ๋™
server.bat start test01

# ์ƒํƒœ ํ™•์ธ (ํ•„์ˆ˜ ๊ฒ€์ฆ ๋‹จ๊ณ„)
server.bat status test01

3. ํ•ต์‹ฌ ์„ค์ • (server.xml)

Liberty์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์€ server.xml ํŒŒ์ผ ํ•˜๋‚˜์— ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ธฐ๋Šฅ(Feature)๋งŒ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์œ„์น˜

  • [WLP_HOME]/usr/servers/[์„œ๋ฒ„๋ช…]/server.xml

์ฃผ์š” ์„ค์ • ์˜ˆ์‹œ

<?xml version="1.0" encoding="UTF-8"?>
<server description="Test Server">

    <!-- 1. Feature Manager: ํ•„์š”ํ•œ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ๋กœ๋“œ -->
    <featureManager>
        <feature>jsp-2.2</feature>
        <feature>jdbc-4.0</feature>
        <feature>localConnector-1.0</feature> <!-- ๋กœ์ปฌ ๊ด€๋ฆฌ์šฉ -->
        <feature>adminCenter-1.0</feature>    <!-- ์›น ๊ด€๋ฆฌ ์ฝ˜์†” -->
    </featureManager>

    <!-- 2. HTTP Endpoint: ํฌํŠธ ์„ค์ • -->
    <!-- host="*"๋Š” ๋ชจ๋“  IP ๋Œ€์—ญ์—์„œ์˜ ์ ‘์†์„ ํ—ˆ์šฉํ•จ -->
    <httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" httpsPort="9443">
        <tcpOptions soReuseAddr="true" />
    </httpEndpoint>

    <!-- 3. Web Server Plugin ์„ค์ • -->
    <pluginConfiguration webserverPort="80" webserverSecurePort="443"/>

    <!-- 4. Application ๋ฐฐํฌ ์„ค์ • (์ž๋™ ์ธ์‹์ด ํŽธํ•จ) -->
    <applicationManager autoExpand="true"/>
    
    <!-- 5. DB Connection (Oracle ์˜ˆ์‹œ) -->
    <dataSource id="WorklightDS" jndiName="jdbc/WorklightDS">
        <jdbcDriver libraryRef="OracleLib"/>
        <properties.oracle 
            driverType="thin" 
            databaseName="ORCL" 
            serverName="localhost" 
            portNumber="1521" 
            user="SCOTT" 
            password="{xor}KDAtNDM2ODcr"/> <!-- securityUtility๋กœ ์•”ํ˜ธํ™” ๊ถŒ์žฅ -->
    </dataSource>

    <!-- 6. Logging ์„ค์ • -->
    <logging maxFiles="5" consoleLogLevel="INFO"/>

</server>
์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ Tip:
์„ค์ • ํŒŒ์ผ์˜ password="{xor}..." ๋ถ€๋ถ„์€ ํ‰๋ฌธ์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์ง€ ์•Š๊ณ , Liberty๊ฐ€ ์ œ๊ณตํ•˜๋Š” bin/securityUtility encode [์•”ํ˜ธ] ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์„ ๋„ฃ์–ด์•ผ ๋ณด์•ˆ์ƒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

4. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ JVM ์˜ต์…˜ ์„ค์ •

๋ฉ”๋ชจ๋ฆฌ(Heap) ์„ค์ •์ด๋‚˜ ๋กœ๊ทธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ ๋“ฑ์€ ๋ณ„๋„์˜ ์„ค์ • ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1) JVM ์˜ต์…˜ (jvm.options)

Heap Size๋‚˜ GC ๋กœ๊ทธ ์„ค์ •์€ jvm.options ํŒŒ์ผ์— ๋ผ์ธ ๋‹จ์œ„๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„์น˜: [WLP_HOME]/usr/servers/[์„œ๋ฒ„๋ช…]/jvm.options
# Heap Memory ์„ค์ •
-Xms512m
-Xmx1024m

# GC ๋กœ๊ทธ ์„ค์ •
-verbose:gc
-Xverbosegclog:verbosegc.log
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC

2) ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (server.env)

JAVA_HOME ์ง€์ •์ด๋‚˜ ์ปค์Šคํ…€ ๋กœ๊ทธ ๊ฒฝ๋กœ๋Š” server.env์— ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# Java ๋ฒ„์ „ ์ง€์ •
JAVA_HOME=C:\Java\jdk1.8.0

# ๋กœ๊ทธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ (Optional)
WLP_OUTPUT_DIR=F:\app\IBM\wlpcore\AppServer\usr\logs\test02

5. ์›น ์„œ๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ์ธ (Plugin) ์ƒ์„ฑ

Liberty ์„œ๋ฒ„ ์•ž๋‹จ์— IHS(Apache)๋ฅผ ๋‘”๋‹ค๋ฉด, plugin-cfg.xml์„ ์ƒ์„ฑํ•˜์—ฌ ์›น ์„œ๋ฒ„์— ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒ์„ฑ ๋„๊ตฌ (pluginUtility)

Liberty 16.0.0.4 ๋ฒ„์ „๋ถ€ํ„ฐ pluginUtility ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

cd [WLP_HOME]/bin

# 1. ๋กœ์ปฌ ์„œ๋ฒ„์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒ์„ฑ
pluginUtility generate --server=test01 --targetpath=./plugin-cfg.xml

# 2. ์›๊ฒฉ ์„œ๋ฒ„์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒ์„ฑ (Admin Center ๊ธฐ๋Šฅ ํ•„์š”)
pluginUtility generate --server=admin:password@remoteHost:9443 --targetpath=./plugin-cfg.xml

# 3. ์—ฌ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ณ‘ํ•ฉ (Merge)
pluginUtility merge --sourcepath=../usr/plugin --targetpath=../usr/merged_plugin.xml

์›น ์„œ๋ฒ„(httpd.conf) ์ ์šฉ

์ƒ์„ฑ๋œ xml ํŒŒ์ผ์„ ์›น ์„œ๋ฒ„๋กœ ๋ณต์‚ฌํ•œ ํ›„ httpd.conf์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

# Windows ์˜ˆ์‹œ
LoadModule was_ap22_module "C:\IBM\HTTPServer\plugins\bin\mod_was_ap22_http.dll"
WebSpherePluginConfig "C:\IBM\HTTPServer\plugins\config\webserver1\plugin-cfg.xml"

# Linux/Unix ์˜ˆ์‹œ
LoadModule was_ap22_module "/opt/IBM/HTTPServer/plugins/bin/mod_was_ap22_http.so"
WebSpherePluginConfig "/opt/IBM/HTTPServer/plugins/config/webserver1/plugin-cfg.xml"

Next Step:
๊ธฐ๋ณธ ์„ค์น˜์™€ ์„ค์ •์ด ๋๋‚ฌ๋‹ค๋ฉด, adminCenter ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €(https://localhost:9443/adminCenter)๋กœ ์ ‘์†ํ•˜์—ฌ GUI ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด ๋ณด์‹ญ์‹œ์˜ค.