[VS Code] ํ•œ๊ธ€ ๊นจ์ง ํ˜„์ƒ ์™„๋ฒฝ ํ•ด๊ฒฐ: Auto Guess Encoding ๋ฐ ์ธ์ฝ”๋”ฉ ์ˆ˜๋™ ๋ณ€๊ฒฝ

Windows ํ™˜๊ฒฝ(CP949/EUC-KR)์—์„œ ์ž‘์„ฑ๋œ ํ…์ŠคํŠธ ํŒŒ์ผ์„ VS Code(๊ธฐ๋ณธ UTF-8)๋กœ ์—ด์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ธ€ ๊นจ์ง ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ์ธ์ฝ”๋”ฉ์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•˜๋Š” ์„ค์ •๊ณผ ์ˆ˜๋™์œผ๋กœ ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•˜์—ฌ ๋‹ค์‹œ ์—ฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

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

ํ•œ๊ธ€ ์œˆ๋„์šฐ ๋ฉ”๋ชจ์žฅ์—์„œ ์ €์žฅํ•œ ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ EUC-KR(๋˜๋Š” CP949) ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, VS Code๋Š” ์ „ ์„ธ๊ณ„ ํ‘œ์ค€์ธ UTF-8์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. ์ด ํ•ด์„ ๋ฐฉ์‹์˜ ์ฐจ์ด๋กœ ์ธํ•ด ํ•œ๊ธ€์ด ''์™€ ๊ฐ™์ด ๊นจ์ ธ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: Windows 10
  • Software: Visual Studio Code

1. Method A: ์ž๋™ ์ธ์ฝ”๋”ฉ ์ธ์‹ ์„ค์ • (Auto Guess Encoding)

VS Code๊ฐ€ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜์—ฌ ์ธ์ฝ”๋”ฉ์„ ์ž๋™์œผ๋กœ ์ถ”์ธกํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์ธ์ฝ”๋”ฉ์„ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†์–ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๋ฐฉ๋ฒ•

  1. ์„ค์ • ์ง„์ž…: ๋ฉ”๋‰ด์—์„œ File > Preferences > Settings (๋‹จ์ถ•ํ‚ค: Ctrl + ,)
  2. ๊ฒ€์ƒ‰: ๊ฒ€์ƒ‰์ฐฝ์— encoding ์ž…๋ ฅ
  3. ์˜ต์…˜ ์ฒดํฌ: Files: Auto Guess Encoding ํ•ญ๋ชฉ์„ ์ฐพ์•„ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ(Check)
Note: ์ด ๊ธฐ๋Šฅ์€ ํ™•๋ฅ ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ถ”์ธกํ•˜๋ฏ€๋กœ, ๊ฐ„ํ˜น ์˜๋ฌธ๋งŒ ์žˆ๋Š” ํŒŒ์ผ์ด๋‚˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์ธ์ฝ”๋”ฉ์„ ์ž˜๋ชป ์ธ์‹ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Method B: ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ์—ด๊ธฐ (Reopen with Encoding)

์ž๋™ ์„ค์ •์ด ๋ถˆ์•ˆํ•˜๊ฑฐ๋‚˜ ํŠน์ • ํŒŒ์ผ๋งŒ ๊นจ์งˆ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ž‘์—… ์ ˆ์ฐจ

  1. VS Code ์šฐ์ธก ํ•˜๋‹จ ์ƒํƒœ ํ‘œ์‹œ์ค„(Status Bar)์— ์žˆ๋Š” UTF-8 ํด๋ฆญ.
  2. ์ƒ๋‹จ ๋ช…๋ น ํŒ”๋ ˆํŠธ์—์„œ "Reopen with Encoding (์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋‹ค์‹œ ์—ด๊ธฐ)" ์„ ํƒ.
  3. ๋ชฉ๋ก์—์„œ "Korean (EUC-KR)" ๊ฒ€์ƒ‰ ํ›„ ์„ ํƒ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒŒ์ผ ๋‚ด์šฉ์€ ๊นจ์ง€์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.


3. Method C: UTF-8๋กœ ์˜๊ตฌ ๋ณ€ํ™˜ (Save with Encoding)

EUC-KR ํŒŒ์ผ์„ ํ–ฅํ›„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด UTF-8๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์ ˆ์ฐจ

  1. ์œ„์˜ Method B๋ฅผ ํ†ตํ•ด ํ•œ๊ธ€์ด ์ •์ƒ์ ์œผ๋กœ ๋ณด์ด๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ์šฐ์ธก ํ•˜๋‹จ ์ƒํƒœ ํ‘œ์‹œ์ค„์˜ ์ธ์ฝ”๋”ฉ(EUC-KR) ํด๋ฆญ.
  3. ์ƒ๋‹จ ๋ช…๋ น ํŒ”๋ ˆํŠธ์—์„œ "Save with Encoding (์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ €์žฅ)" ์„ ํƒ.
  4. "UTF-8" ์„ ํƒ.

์ด์ œ ์ด ํŒŒ์ผ์€ ์˜๊ตฌ์ ์œผ๋กœ UTF-8๋กœ ์ €์žฅ๋˜์–ด, ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ํ•œ๊ธ€์ด ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


4. ๊ฒฐ๊ณผ ํ™•์ธ (Verification)

์„ค์ •์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ธ์ฝ”๋”ฉ์„ ๋ณ€๊ฒฝํ•œ ํ›„, ๊นจ์ ธ ๋ณด์ด๋˜ ํ•œ๊ธ€ ์ฃผ์„์ด๋‚˜ ํ…์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Before (๊นจ์ง)

Broken Korean Text

After (์ •์ƒ)

Fixed Korean Text

Next Step:
ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ํŒ€์› ๊ฐ„์˜ ์ธ์ฝ”๋”ฉ ํ†ต์ผ์„ ์œ„ํ•ด .editorconfig ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์ƒ์„ฑํ•˜์—ฌ charset = utf-8์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] ์„ค์น˜ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ: java.lang.UnsupportedClassVersionError (JDK ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ)

JBoss EAP 7 ์„ค์น˜ ๋˜๋Š” ๊ธฐ๋™ ์ค‘ java.lang.UnsupportedClassVersionError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ํ˜„์žฌ ์„œ๋ฒ„์— ์„ค์ •๋œ Java ๋ฒ„์ „์ด JBoss๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ตœ์†Œ ์‚ฌ์–‘(JDK 1.8)๋ณด๋‹ค ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ major.minor version ์ˆซ์ž๋ฅผ ํ†ตํ•ด ์›์ธ์„ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ ๋ฐ ์›์ธ ๋ถ„์„

JBoss ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Exception in thread "main" java.lang.UnsupportedClassVersionError: 
com/ibm/websphere/... : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    ...

์›์ธ (Root Cause)

์ด ์—๋Ÿฌ๋Š” ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์˜ ๋ฒ„์ „(Target JVM)๋ณด๋‹ค ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM ๋ฒ„์ „(Runtime)์ด ๋‚ฎ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • JBoss EAP 7.x ์š”๊ตฌ์‚ฌํ•ญ: ์ตœ์†Œ JDK 1.8 ์ด์ƒ
  • ํ˜„์žฌ ์„œ๋ฒ„ ์ƒํ™ฉ: JDK 1.7 ์ดํ•˜๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜ JAVA_HOME์ด ๊ตฌ๋ฒ„์ „์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ

2. ๋ฒ„์ „ ๋งคํ•‘ ํ…Œ์ด๋ธ” (Class File Format)

์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ๋œจ๋Š” ์ˆซ์ž(52.0, 51.0 ๋“ฑ)๋Š” Java ํด๋ž˜์Šค ํŒŒ์ผ ํฌ๋งท์˜ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ˜„์žฌ ํ•„์š”ํ•œ Java ๋ฒ„์ „์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Java Version (SE) Major Version (Hex) Major Version (Dec)
Java 14 0x3A 58
Java 13 0x39 57
Java 12 0x38 56
Java 11 0x37 55
Java 9 0x35 53
Java 8 0x34 52
Java 7 0x33 51
Java 6 0x32 50
๋ถ„์„ ์˜ˆ์‹œ:
์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ Unsupported major.minor version 52.0์ด๋ผ๋ฉด, ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์€ Java 8๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„์—๋„ Java 8 ์ด์ƒ์ด ์„ค์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Solution)

1) ํ˜„์žฌ Java ๋ฒ„์ „ ํ™•์ธ

java -version

์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ 1.7.x ์ดํ•˜๋ผ๋ฉด JDK ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2) JDK ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ

์„œ๋ฒ„์— JDK 1.8 ์ด์ƒ์„ ์„ค์น˜ํ•œ ํ›„, JBoss๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์„ค์ • ํŒŒ์ผ์—์„œ JAVA_HOME ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Standalone ๋ชจ๋“œ: [EAP_HOME]/bin/standalone.conf (Windows๋Š” .bat)
  • Domain ๋ชจ๋“œ: [EAP_HOME]/bin/domain.conf (Windows๋Š” .bat)
# standalone.conf ์˜ˆ์‹œ
# JAVA_HOME="/usr/lib/jvm/java-1.7.0"  <-- ๊ธฐ์กด (์ฃผ์„ ์ฒ˜๋ฆฌ)
JAVA_HOME="/usr/lib/jvm/java-1.8.0"    <-- ์‹ ๊ทœ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ

Next Step:
JDK ๋ฒ„์ „์„ ์˜ฌ๋ฆฐ ํ›„์—๋Š” ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAR/EAR)์ด ์ƒˆ Java ๋ฒ„์ „์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€, -Xmx ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ์˜ต์…˜์ด ๋ณ€๊ฒฝ๋œ ๋ฒ„์ „์— ๋งž๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Windows] CMD๋ฅผ ๋ฆฌ๋ˆ…์Šค ํ„ฐ๋ฏธ๋„์ฒ˜๋Ÿผ: doskey๋ฅผ ์ด์šฉํ•œ Alias(๋งคํฌ๋กœ) ์„ค์ • ๋ฐ ์˜๊ตฌ ์ ์šฉ

Windows CMD ํ™˜๊ฒฝ์—์„œ ls, cp, rm ๋“ฑ ์ต์ˆ™ํ•œ Linux ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด doskey ๋งคํฌ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ํŒŒ์ผ(alias.cmd)์„ ์ž‘์„ฑํ•˜๊ณ  ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(AutoRun)์— ๋“ฑ๋กํ•˜์—ฌ CMD ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ๋ณ„์นญ์ด ์ ์šฉ๋˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ (Context)

Windows CMD๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ dir, copy, del ๋“ฑ์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Linux์˜ ls, cp ๋“ฑ์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž๋Š” ๋งค๋ฒˆ ์˜คํƒ€๋ฅผ ๋‚ด๊ฑฐ๋‚˜ ๋ถˆํŽธํ•จ์„ ๊ฒช๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด doskey ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์–ด์˜ ๋ณ„์นญ(Alias)์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: Windows 10 / 11
  • Shell: Command Prompt (CMD)

1. ๋งคํฌ๋กœ ํŒŒ์ผ ์ž‘์„ฑ (alias.cmd)

๋จผ์ €, ๋งคํฌ๋กœ ์ •์˜๋ฅผ ๋‹ด์„ ๋ฐฐ์น˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ ๋‹นํ•œ ์œ„์น˜(์˜ˆ: C:\Utils\alias.cmd)์— ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

Tip: $*๋Š” ์ž…๋ ฅ๋œ ๋ชจ๋“  ์ธ์ž(Arguments)๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. (์˜ˆ: ls -al ์ž…๋ ฅ ์‹œ dir -al๋กœ ๋ณ€ํ™˜)
@echo off

:: --- System & Utility ---
doskey alias   = doskey $*
doskey clear   = cls
doskey history = doskey /history
doskey man     = help $*

:: --- Process Management ---
doskey ps      = tasklist $*
doskey kill    = taskkill /PID $*

:: --- File & Directory Management ---
doskey ls      = dir $*
doskey ll      = dir $*
doskey cat     = type $*
doskey pwd     = cd
doskey cp      = copy $*
doskey mv      = move $*
doskey rm      = del $*

:: --- Search (grep -> findstr ๊ถŒ์žฅ) ---
:: find๋Š” ๋‹จ์ˆœ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰, findstr์€ ์ •๊ทœ์‹ ์ง€์›
doskey grep    = find $* :: --- Permissions (Approximate) ---
doskey sudo    = runas /user:administrator $*

2. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ๋ก (์˜๊ตฌ ์ ์šฉ)

์œ„์—์„œ ๋งŒ๋“  alias.cmd ํŒŒ์ผ์€ CMD๋ฅผ ์ผค ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ AutoRun ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ ๋ฐ ๊ฐ’

  • ๊ฒฝ๋กœ: HKEY_CURRENT_USER\Software\Microsoft\Command Processor
  • ๋ฌธ์ž์—ด ๊ฐ’(String Value): AutoRun
  • ๋ฐ์ดํ„ฐ(Data): [alias.cmd ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ]

๋“ฑ๋ก ๋ฐฉ๋ฒ• A: ๋ช…๋ น์–ด๋กœ ํ•œ๋ฐฉ์— ๋“ฑ๋ก (๊ถŒ์žฅ)

๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ CMD๋ฅผ ์—ด๊ณ  ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. (๊ฒฝ๋กœ๋Š” ๋ณธ์ธ ํŒŒ์ผ ์œ„์น˜์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์„ธ์š”)

:: ๊ฒฝ๋กœ ์˜ˆ์‹œ: E:\software\google\2_Shellscript\alias.cmd
reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t REG_SZ /d "E:\software\google\2_Shellscript\alias.cmd" /f

๋“ฑ๋ก ๋ฐฉ๋ฒ• B: regedit ์‚ฌ์šฉ (์ˆ˜๋™)

  1. Win + R ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ  regedit ์‹คํ–‰
  2. ์ปดํ“จํ„ฐ\HKEY_CURRENT_USER\Software\Microsoft\Command Processor ๊ฒฝ๋กœ๋กœ ์ด๋™
  3. ์šฐ์ธก ๋นˆ ๊ณต๊ฐ„ ์šฐํด๋ฆญ > ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ > ๋ฌธ์ž์—ด ๊ฐ’ ์„ ํƒ
  4. ์ด๋ฆ„์„ AutoRun์œผ๋กœ ์ง€์ •
  5. ๋”๋ธ” ํด๋ฆญํ•˜์—ฌ ๊ฐ’ ๋ฐ์ดํ„ฐ์— alias.cmd์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์ž…๋ ฅ

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

์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด CMD ์ฐฝ์„ ์—ด์–ด์„œ ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

:: 1. CMD ์‹คํ–‰
C:\Users\User>

:: 2. ls ๋ช…๋ น์–ด ํ…Œ์ŠคํŠธ
C:\Users\User> ls
 C ๋“œ๋ผ์ด๋ธŒ์˜ ๋ณผ๋ฅจ์—๋Š” ์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค.
 ... (๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก ์ถœ๋ ฅ) ...

:: 3. alias ๋ชฉ๋ก ํ™•์ธ
C:\Users\User> alias /macros

Next Step:
๋งŒ์•ฝ CMD๊ฐ€ ์•„๋‹Œ PowerShell์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด, Microsoft.PowerShell_profile.ps1 ํŒŒ์ผ์— Set-Alias ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[Linux] ์„œ๋ฒ„ ๊ด€๋ฆฌ ํ•„์ˆ˜ ๋ช…๋ น์–ด ๋ชจ์Œ: ๋กœ๊ทธ ์ •๋ฆฌ(find), ๋„คํŠธ์›Œํฌ(netstat), ๋ฉ”๋ชจ๋ฆฌ ์ ๊ฒ€

๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ ์šด์˜ ์ค‘ ๋กœ๊ทธ ํŒŒ์ผ ์ •๋ฆฌ, ๋””์Šคํฌ ์šฉ๋Ÿ‰ ํ™•๋ณด, ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ƒํƒœ ์ ๊ฒ€, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  ํ™•์ธ์„ ์œ„ํ•ด ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด ํŒจํ„ด(One-Liner)์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. RedHat/CentOS 7 ํ™˜๊ฒฝ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7, RedHat 7.2
  • Shell: Bash

1. ํŒŒ์ผ ๊ฒ€์ƒ‰ ๋ฐ ์ •๋ฆฌ (File Management)

์„œ๋ฒ„ ์šด์˜ ์ค‘ ๊ฐ€์žฅ ํ”ํ•œ ์ด์Šˆ๋Š” ๋กœ๊ทธ ํŒŒ์ผ๋กœ ์ธํ•œ ๋””์Šคํฌ ํ’€(Disk Full)์ž…๋‹ˆ๋‹ค. find ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ž˜๋œ ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์ตœ๊ทผ ์ˆ˜์ •๋œ ํŒŒ์ผ ์ฐพ๊ธฐ

์„ค์ • ํŒŒ์ผ(xml ๋“ฑ)์ด ์ตœ๊ทผ์— ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# ์ตœ๊ทผ 7์ผ ์ด๋‚ด(-7)์— ์ˆ˜์ •๋œ xml ํŒŒ์ผ ๊ฒ€์ƒ‰
find . -type f -name "*.xml" -mtime -7 -print

์˜ค๋ž˜๋œ ๋กœ๊ทธ ํŒŒ์ผ ์‚ญ์ œ

๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ผ์ • ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ํŒŒ์ผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์‚ญ์ œ ๋ช…๋ น(rm)์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „, ๋ฐ˜๋“œ์‹œ ์กฐํšŒ(ls)๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜์—ฌ ๋Œ€์ƒ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# 1. ๋Œ€์ƒ ํ™•์ธ (7์ผ์ด ์ง€๋‚œ ๋กœ๊ทธ ํŒŒ์ผ ์กฐํšŒ)
find /log/server1 -name "*.log" -mtime +7 -print

# 2. ์‚ญ์ œ ์‹คํ–‰ (๋ฐฉ๋ฒ• A: -delete ์˜ต์…˜ ์‚ฌ์šฉ)
find /log/server1 -name "*.log" -mtime +7 -delete

# 2. ์‚ญ์ œ ์‹คํ–‰ (๋ฐฉ๋ฒ• B: -exec rm ์‚ฌ์šฉ, ๊ฐ€์žฅ ๋ฒ”์šฉ์ )
find /log/server1 -name "*.log" -mtime +7 -exec rm -f {} \;

# 3. 30์ผ ์ด์ƒ ๋œ ๋กœ๊ทธ ํŒŒ์ผ๋งŒ ๊ฐ•์ œ ์‚ญ์ œ
find /log/server1 -type f -name "*.log" -ctime +30 -exec rm -rf {} \;

๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ๊ฒ€์ƒ‰

๋””์Šคํฌ ์šฉ๋Ÿ‰์„ ๋งŽ์ด ์ฐจ์ง€ํ•˜๋Š” ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

# 3GB ์ด์ƒ์ธ ํŒŒ์ผ์„ ์ฐพ์•„ ์šฉ๋Ÿ‰๊ณผ ํ•จ๊ป˜ ์ถœ๋ ฅ
find . -size +3000000k -exec ls -lh {} \+

๋‚ ์งœ์ˆœ ํŒŒ์ผ ์ •๋ ฌ ๋ณด๊ธฐ

๊ธฐ๋ณธ ls -l์˜ ๋‚ ์งœ ํฌ๋งท์ด ๋ณด๊ธฐ ํž˜๋“ค ๋•Œ ISO ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ls --time-style="+%Y-%m-%d %H:%M:%S" -altr | grep ^- | more

2. ๋„คํŠธ์›Œํฌ ์ƒํƒœ ์ ๊ฒ€ (Network Monitoring)

์›น ์„œ๋ฒ„๋‚˜ DB ์„œ๋ฒ„์˜ ํ˜„์žฌ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ์ŠคํŒŒ์ดํฌ๋‚˜ ์—ฐ๊ฒฐ ๋ˆ„์ˆ˜(Leak)๋ฅผ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.

๋™์‹œ ์ ‘์†์ž ์ˆ˜ ํ™•์ธ (Web Server)

ESTABLISHED ์ƒํƒœ๋Š” ํ˜„์žฌ ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

# 80 ํฌํŠธ ๋™์‹œ ์ ‘์†์ž ์ˆ˜ ์นด์šดํŠธ
netstat -nap | grep :80 | grep ESTABLISHED | wc -l

# 8080 ํฌํŠธ(WAS) ๋™์‹œ ์ ‘์†์ž ์ˆ˜ ์นด์šดํŠธ
netstat -nap | grep :8080 | grep ESTABLISHED | wc -l

DB ์—ฐ๊ฒฐ ํ’€(Connection Pool) ํ™•์ธ

WAS์—์„œ DB๋กœ ๋งบ์€ ์—ฐ๊ฒฐ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํฌํŠธ ๋ฒˆํ˜ธ๋กœ grepํ•˜์—ฌ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

# ํŠน์ • ํฌํŠธ์™€ ์—ฐ๊ฒฐ๋œ ์†Œ์ผ“ ์ •๋ณด ํ™•์ธ
netstat -anp | grep {port_number}

# ์—ฐ๊ฒฐ ๊ฐœ์ˆ˜ ์นด์šดํŠธ
netstat -anp | grep {port_number} | wc -l

3. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  ์ ๊ฒ€ (Memory Check)

๋ฆฌ๋ˆ…์Šค์˜ free ๋ช…๋ น์–ด๋Š” ๋ฒ„ํผ/์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ(Actual Used)๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ณ„์‚ฐ ์Šคํฌ๋ฆฝํŠธ (Shell)

์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋Œ€๋น„ ์‹ค์ œ ์‚ฌ์šฉ๋ฅ ์„ ๋ฐฑ๋ถ„์œจ(%)๋กœ ๊ณ„์‚ฐํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

#!/bin/sh
# free ๋ช…๋ น์–ด์˜ ์ถœ๋ ฅ ์ปฌ๋Ÿผ ์œ„์น˜๋Š” OS ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ™•์ธ ํ•„์š” (awk $2, $3...)

# Total Memory
TOTAL=`free | grep ^Mem | awk '{print $2}'`

# Used Memory (OS ๊ด€์ )
USED1=`free | grep ^Mem | awk '{print $3}'`

# Used Memory (Buffer/Cache ์ œ์™ธ, CentOS 6 ์ดํ•˜ ๊ตฌ๋ฒ„์ „ ๋ฐฉ์‹)
# USED2=`free | grep ^-/+ | awk '{print $3}'`

# CentOS 7 ์ด์ƒ (available ์ปฌ๋Ÿผ ๋“ฑ ๊ณ ๋ ค ํ•„์š”ํ•˜๋‚˜ ๋‹จ์ˆœ ๊ณ„์‚ฐ ์‹œ)
# ๋ฒ„ํผ/์บ์‹œ๋ฅผ ํฌํ•จํ•œ ๋‹จ์ˆœ ์‚ฌ์šฉ๋ฅ 
NOMINAL=$((100*USED1/TOTAL))

echo "Memory Usage: ${NOMINAL}%"

One-Liner (๊ฐ„ํŽธ ๊ณ„์‚ฐ)

awk๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ์ค„๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

# ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋Œ€๋น„ ์‚ฌ์šฉ๋Ÿ‰(Used) ๋น„์œจ
awk '/^Mem/ {printf("Used: %u%%", 100*$3/$2);}' <(free -m)

# (์ฐธ๊ณ ) ๋ฒ„ํผ/์บ์‹œ๋ฅผ ์ œ์™ธํ•œ ์‹ค ์‚ฌ์šฉ๋ฅ  ๊ณ„์‚ฐ์€ free -m์˜ available ์ปฌ๋Ÿผ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.
free -m | awk 'NR==2{printf "Memory Usage: %.2f%%\n", ($3/$2)*100 }'

Next Step:
๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์œ„ ๋ช…๋ น์–ด๋“ค์„ ~/.bash_profile์— alias๋กœ ๋“ฑ๋กํ•ด๋‘๋ฉด, ๊ธด ๋ช…๋ น์–ด๋ฅผ ํƒ€์ดํ•‘ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ๊ณ  ์˜คํƒ€๋กœ ์ธํ•œ ์‚ฌ๊ณ ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[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 ๋“ฑ)์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[Tomcat] Windows ํ™˜๊ฒฝ Apache Tomcat 9 ์„ค์น˜ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

Windows 10 ํ™˜๊ฒฝ์—์„œ Java ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์ธ Apache Tomcat 9์„ ์„ค์น˜ํ•˜๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. JDK ์„ค์น˜ ํ™•์ธ๋ถ€ํ„ฐ ๋‹ค์šด๋กœ๋“œ, ์••์ถ• ํ•ด์ œ, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์š” ๋””๋ ‰ํ† ๋ฆฌ(bin, conf, logs)์˜ ์—ญํ• ๊ณผ ๊ตฌ๋™ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

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

Tomcat์€ Java๋กœ ๊ตฌ๋™๋˜๋ฏ€๋กœ JDK(Java Development Kit)๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์„ค์น˜ ์ „ ๋ฐ˜๋“œ์‹œ Java ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Java ์„ค์น˜ ํ™•์ธ

:: CMD ์ฐฝ์—์„œ ํ™•์ธ
java -version
javac -version
Check Point: ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด JDK๋ฅผ ๋จผ์ € ์„ค์น˜ํ•˜๊ณ , ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(JAVA_HOME, PATH)๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Tomcat์€ ์‹คํ–‰ ์‹œ JAVA_HOME์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

1. ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜ (Download & Install)

์„ค์น˜ํ˜•(Installer)๋ณด๋‹ค๋Š” ์••์ถ•ํ˜•(Zip)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋””๋ ‰ํ† ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋™์‹œ์— ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œ

  • ๊ณต์‹ ์‚ฌ์ดํŠธ: http://tomcat.apache.org/
  • ๋ฒ„์ „ ์„ ํƒ: Tomcat 9 (Latest Stable) > Binary Distributions > Core: zip (64-bit/32-bit Windows)

์„ค์น˜ (์••์ถ• ํ•ด์ œ)

๋‹ค์šด๋กœ๋“œํ•œ Zip ํŒŒ์ผ์„ ์›ํ•˜๋Š” ๊ฒฝ๋กœ์— ์••์ถ• ํ•ด์ œํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์„ค์น˜๋Š” ๋๋‚ฉ๋‹ˆ๋‹ค.

  • ์„ค์น˜ ๊ฒฝ๋กœ ์˜ˆ์‹œ: E:\APP\WAS\TOMCAT9

2. ์ฃผ์š” ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ (Directory Structure)

์••์ถ•์„ ํ•ด์ œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํด๋”์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด WAS ์šด์˜์˜ ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ ์—ญํ•  ๋ฐ ์ฃผ์š” ํŒŒ์ผ
/bin ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
- startup.bat: ์„œ๋ฒ„ ์‹œ์ž‘ (Windows)
- shutdown.bat: ์„œ๋ฒ„ ์ค‘์ง€ (Windows)
- catalina.bat: ์‹คํ–‰ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ ์˜ต์…˜ ์„ค์ •
/conf ์„œ๋ฒ„ ์ „์ฒด ์„ค์ • ํŒŒ์ผ์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
- server.xml: ํฌํŠธ(8080, 8009), ์—”์ง„ ์„ค์ •
- web.xml: ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ, MIME ํƒ€์ž… ๋“ฑ ๊ณตํ†ต ์„ค์ •
/lib Tomcat ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Jar) ์ €์žฅ์†Œ (JDBC ๋“œ๋ผ์ด๋ฒ„ ๋“ฑ ํฌํ•จ)
/logs ์„œ๋ฒ„ ๋กœ๊ทธ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
- catalina.yyyy-mm-dd.log: ์—”์ง„ ๋กœ๊ทธ
- localhost_access_log: ์ ‘์† ๋กœ๊ทธ
/webapps ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAR ํŒŒ์ผ)์„ ๋ฐฐํฌํ•˜๋Š” ๊ธฐ๋ณธ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

3. ๊ตฌ๋™ ๋ฐ ๊ฒ€์ฆ (Start & Verify)

์„ค์น˜๊ฐ€ ์ œ๋Œ€๋กœ ๋˜์—ˆ๋Š”์ง€ ์„œ๋ฒ„๋ฅผ ์ผœ์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๊ตฌ๋™

:: bin ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd E:\APP\WAS\TOMCAT9\bin

:: ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ ๋™์ž‘
startup.bat

์ƒˆ๋กœ์šด CMD ์ฐฝ์ด ๋œจ๋ฉด์„œ ๋กœ๊ทธ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ณ , ๋งˆ์ง€๋ง‰์— Server startup in [xxx] ms ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์ด๋ฉด ๊ตฌ๋™ ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.

์ ‘์† ํ…Œ์ŠคํŠธ

๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:8080 ์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์–‘์ด ๊ทธ๋ฆผ์ด ์žˆ๋Š” Tomcat ๊ธฐ๋ณธ ํŽ˜์ด์ง€๊ฐ€ ๋œฌ๋‹ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


Next Step:
๊ธฐ๋ณธ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” server.xml์„ ์ˆ˜์ •ํ•˜์—ฌ HTTP ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์ธ์ฝ”๋”ฉ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋Š” Tomcat ๊ธฐ๋ณธ ์„ค์ • ํŠœ๋‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

[IHS] SSL/TLS ๋ณด์•ˆ ๊ฐ•ํ™”: Protocol ๋น„ํ™œ์„ฑํ™” ๋ฐ Cipher Suite ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์„ค์ •

IBM HTTP Server(IHS)๋Š” Apache ๊ธฐ๋ฐ˜์ด์ง€๋งŒ, SSL ๋ชจ๋“ˆ์€ ๋ณ„๋„์˜ mod_ibm_ssl์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ Apache(mod_ssl)์™€ ํ”„๋กœํ† ์ฝœ ์„ค์ • ๋ฌธ๋ฒ•์ด ์ƒ์ดํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์„œ๋ฒ„ ๊ฐ„์˜ ์„ค์ • ์ฐจ์ด๋ฅผ ๋น„๊ตํ•˜๊ณ , IHS v8.5 ํ™˜๊ฒฝ์—์„œ์˜ ๋ณด์•ˆ ๊ฐ•ํ™” ์„ค์ •์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[Image of SSL TLS handshake process]

1. Apache vs IHS ์„ค์ • ์ฐจ์ด์  (Comparison)

๋‘ ์›น ์„œ๋ฒ„๋Š” SSL/TLS ํ•ธ๋“œ์‰์ดํฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—”์ง„๊ณผ ๋ชจ๋“ˆ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, httpd.conf์— ์ž‘์„ฑํ•˜๋Š” ์ง€์‹œ์–ด(Directive)๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋‚˜ ์šด์˜ ์‹œ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ Apache HTTP Server (Community) IBM HTTP Server (IHS)
์‚ฌ์šฉ ๋ชจ๋“ˆ mod_ssl (OpenSSL ๊ธฐ๋ฐ˜) mod_ibm_ssl (IBM GSKit ๊ธฐ๋ฐ˜)
ํ”„๋กœํ† ์ฝœ ์„ค์ • SSLProtocol (ํ•œ ์ค„๋กœ ์ œ์–ด) SSLProtocolDisable
SSLProtocolEnable (๊ฐœ๋ณ„ ์ œ์–ด)
Cipher ์„ค์ • SSLCipherSuite SSLCipherSpec

์„ค์ • ๋ฌธ๋ฒ• ๋น„๊ต ์˜ˆ์‹œ

Apache (mod_ssl)

# ๋ชจ๋“  ํ”„๋กœํ† ์ฝœ์—์„œ SSLv2, SSLv3 ์ œ์™ธ
SSLProtocol all -SSLv2 -SSLv3

# Cipher Suite ์„ค์ • (OpenSSL ๋ช…๋ช…๊ทœ์น™ ์‚ฌ์šฉ)
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

IHS (mod_ibm_ssl)

# ๊ฐœ๋ณ„์ ์œผ๋กœ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์ง€์ •
SSLProtocolDisable SSLv2
SSLProtocolDisable SSLv3
SSLProtocolEnable TLSv12

# Cipher Spec ์„ค์ • (Long Name ์‚ฌ์šฉ, ์ดˆ๊ธฐํ™” ํ›„ ์ถ”๊ฐ€ ๋ฐฉ์‹ ๊ถŒ์žฅ)
SSLCipherSpec ALL NONE
SSLCipherSpec ALL +TLS_RSA_WITH_AES_128_CBC_SHA

2. IHS ๋ณด์•ˆ ์„ค์ • ๊ฐ€์ด๋“œ (Configuration)

IHS v8.5 ์ด์ƒ ํ™˜๊ฒฝ์—์„œ ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ฐจ๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•œ Cipher๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
Listen 443

# IP ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ํ™œ์„ฑํ™” (IHS 8.5 ์ดํ•˜ ํ•„์ˆ˜)
NameVirtualHost *:443

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /app/EAR/SSL
    
    # SSL ์—”์ง„ ํ™œ์„ฑํ™”
    SSLEnable
    
    # 1. ์ทจ์•ฝ ํ”„๋กœํ† ์ฝœ ๋ช…์‹œ์  ๋น„ํ™œ์„ฑํ™”
    # (TLS 1.0, 1.1๋„ ๋ณด์•ˆ ์ •์ฑ…์— ๋”ฐ๋ผ ์ฐจ๋‹จ ๊ณ ๋ ค)
    SSLProtocolDisable SSLv2
    SSLProtocolDisable SSLv3
    SSLProtocolDisable TLSv10
    SSLProtocolDisable TLSv11
    
    # 2. ์•ˆ์ „ํ•œ ํ”„๋กœํ† ์ฝœ ํ™œ์„ฑํ™”
    SSLProtocolEnable TLSv12
    
    # 3. Cipher Suite ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์„ค์ •
    # ์ค‘์š”: 'ALL NONE'์œผ๋กœ ๊ธฐ์กด ์„ค์ • ์ดˆ๊ธฐํ™”
    SSLCipherSpec ALL NONE
    
    # Forward Secrecy(PFS)๋ฅผ ์ง€์›ํ•˜๋Š” ECDHE ๊ณ„์—ด ์šฐ์„  ๋ฐฐ์น˜
    SSLCipherSpec ALL +TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 +TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    SSLCipherSpec ALL +TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    
    # ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ RSA/AES ๊ณ„์—ด ์ถ”๊ฐ€
    SSLCipherSpec ALL +TLS_RSA_WITH_AES_256_CBC_SHA +TLS_RSA_WITH_AES_128_CBC_SHA
</VirtualHost>

KeyFile /SW/web/HTTPServer/key/key.kdb
SSLDisable

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

์„ค์ • ์ ์šฉ ํ›„ IHS๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ธฐ ์ „, ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ ์šฉ๋œ Cipher ๋ชฉ๋ก์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ๋œ Cipher ํ™•์ธ

cd [IHS_HOME]/bin
./apachectl -t -D DUMP_SSL_CONFIG

์ ‘์† ํ…Œ์ŠคํŠธ (nmap)

์™ธ๋ถ€์—์„œ ์Šค์บ”ํ•˜์—ฌ ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ(SSLv3 ๋“ฑ)์ด ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”์ง€ ๊ต์ฐจ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

nmap --script ssl-enum-ciphers -p 443 [Target_IP]

Next Step:
IHS 9.0 (Apache 2.4 ๊ธฐ๋ฐ˜)์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๊ฒฝ์šฐ, SSLProtocol ์ง€์‹œ์–ด๋ฅผ Apache ์Šคํƒ€์ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ง€๋งŒ, ๊ธฐ์กด IHS ์„ค์ •๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด IBM ๋ฌธ์„œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

[Apache/IHS] IP ์ ‘์† ๋ฐ ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ ์š”์ฒญ ์ฐจ๋‹จ ์„ค์ • (Default VirtualHost)

Apache(IHS) ์›น ์„œ๋ฒ„์—์„œ ๋„๋ฉ”์ธ๋ช…์ด ์•„๋‹Œ IP ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๊ฑฐ๋‚˜, ServerName์— ์ •์˜๋˜์ง€ ์•Š์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ์ด๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ๋กœ๋”ฉ๋˜๋Š” Dummy VirtualHost๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

Apache๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์˜ Host ํ—ค๋”์™€ ์ผ์น˜ํ•˜๋Š” ServerName(๋˜๋Š” ServerAlias)์„ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ, ์„ค์ • ํŒŒ์ผ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ •์˜๋œ VirtualHost๋ฅผ ๊ธฐ๋ณธ๊ฐ’(Default)์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์ตœ์ƒ๋‹จ์— ์•„๋ฌด๋Ÿฐ ServerName์„ ๊ฐ–์ง€ ์•Š๋Š”(ํ˜น์€ ๋”๋ฏธ ๊ฐ’์„ ๊ฐ€์ง„) VirtualHost๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  403 Forbidden ๋“ฑ์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋ฉด, ์ง€์ •๋œ ๋„๋ฉ”์ธ ์™ธ์˜ ๋ชจ๋“  ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTPServer v8.5 (Apache 2.2 Base)

1. httpd.conf ์„ค์ • (VirtualHost ๊ตฌ์„ฑ)

ํ•ต์‹ฌ์€ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ฐจ๋‹จ์šฉ(Dummy) ์„ค์ •์„ ์ •์ƒ ์„œ๋น„์Šค ์„ค์ •๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ์œ„์ชฝ์— ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) ๊ธฐ๋ณธ ์„ค์ • ๋ฐ ํฌํŠธ ๋ฆฌ์Šจ

Listen 80
Listen 4958

# Apache 2.2 / IHS 8.5 ์ดํ•˜ ํ•„์ˆ˜ (IP ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ˜ธ์ŠคํŠธ ํ™œ์„ฑํ™”)
NameVirtualHost *:80
NameVirtualHost *:4958

2) ์ฐจ๋‹จ์šฉ Dummy VirtualHost (์ตœ์ƒ๋‹จ ๋ฐฐ์น˜)

์ด ๋ธ”๋ก์—๋Š” ServerName์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜๋ฏธ ์—†๋Š” ๊ฐ’์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด๊ณณ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์€ ๋ชจ๋‘ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

# [80 ํฌํŠธ] ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ/IP ์ ‘์† ์ฐจ๋‹จ
<VirtualHost *:80>
    DocumentRoot /app/was/htdocs
    
    # ์ ‘๊ทผ ๊ฑฐ๋ถ€ ๋ฉ”์‹œ์ง€ ์„ค์ • (๋ณด์•ˆ์ƒ ์ƒ์„ธ ์ •๋ณด ์ˆจ๊น€ ๊ถŒ์žฅ)
    ErrorDocument 403 "Forbidden: Access is denied."
    ErrorDocument 404 "Not Found."
    ErrorDocument 500 "Internal Server Error."
    
    # ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด 403 Forbidden ๊ฐ•์ œ ๋ฐ˜ํ™˜ (mod_rewrite ์‚ฌ์šฉ ์‹œ)
    # RewriteEngine On
    # RewriteRule .* - [R=403,L]
    
    # ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด
    <Directory "/app/was/htdocs">
        Order allow,deny
        Deny from all
    </Directory>
</VirtualHost>

# [4958 ํฌํŠธ] ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ/IP ์ ‘์† ์ฐจ๋‹จ
<VirtualHost *:4958>
    DocumentRoot /app/was/htdocs
    ErrorDocument 403 "Forbidden: Access is denied."
    # ... (์ƒ๋™)
</VirtualHost>

3) ์‹ค์ œ ์„œ๋น„์Šค VirtualHost

์ •์ƒ์ ์ธ ๋„๋ฉ”์ธ(ServerName)์„ ๊ฐ€์ง„ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. Proxy ์„ค์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

# Reverse Proxy ์‚ฌ์šฉ ์‹œ Open Relay ๋ฐฉ์ง€
ProxyRequests Off

# [80 ํฌํŠธ] ์ •์ƒ ์„œ๋น„์Šค
<VirtualHost *:80>
    ServerName test.apache.com
    
    # WAS ๋˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ํ”„๋ก์‹œ
    ProxyPass / http://172.31.98.155/ Keepalive=on
    ProxyPassReverse / http://172.31.98.155/
    
    # Host ํ—ค๋” ์œ ์ง€ (WAS๊ฐ€ ๋„๋ฉ”์ธ์„ ์ธ์‹ํ•˜๋„๋ก ํ•จ)
    ProxyPreserveHost On
    
    ErrorLog /app/was/HTTPServer/logs/test_proxy_error.log
    CustomLog /app/was/HTTPServer/logs/test_proxy_access.log combined
</VirtualHost>

# [4958 ํฌํŠธ] ์ •์ƒ ์„œ๋น„์Šค
<VirtualHost *:4958>
    ServerName test.httpserver.com
    
    ProxyPass / http://172.31.98.209/ Keepalive=on
    ProxyPassReverse / http://172.31.98.209/
    ProxyPreserveHost On
    
    ErrorLog /app/was/HTTPServer/logs/http_proxy_error.log
    CustomLog /app/was/HTTPServer/logs/http_proxy_access.log combined
</VirtualHost>
Tip: ProxyPreserveHost On ์˜ต์…˜์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋„๋ฉ”์ธ ์ •๋ณด(Host Header)๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„(WAS)๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. WAS์—์„œ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•„์ˆ˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

2. ๊ฒ€์ฆ (Verification)

์„ค์ • ์ ์šฉ ํ›„ ์›น ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ณ  curl์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

1) ์ •์ƒ ๋„๋ฉ”์ธ ์ ‘์† ํ…Œ์ŠคํŠธ

# ์ •์ƒ ์‘๋‹ต(200 OK)์ด ์™€์•ผ ํ•จ
curl -v -H "Host: test.apache.com" http://localhost:80/

2) IP ์ ‘์† ๋ฐ ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ

# 1. IP๋กœ ์ง์ ‘ ์š”์ฒญ -> 403 ๋˜๋Š” ์„ค์ •ํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•จ
curl -v http://localhost:80/

# 2. ์—‰๋šฑํ•œ ๋„๋ฉ”์ธ ์š”์ฒญ -> 403 ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•จ
curl -v -H "Host: unknown.com" http://localhost:80/

Next Step:
Apache 2.4 (IHS 9.0 ์ด์ƒ)๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, NameVirtualHost ์ง€์‹œ์–ด๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ญ์ œํ•˜๊ณ , ์ ‘๊ทผ ์ œ์–ด ๊ตฌ๋ฌธ์„ Require all denied ๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Linux] CentOS 7 ํ˜ธ์ŠคํŠธ๋„ค์ž„(Hostname) ์˜๊ตฌ ๋ณ€๊ฒฝ ๋ฐ ํ•„์ˆ˜ ํ›„์† ์กฐ์น˜ (hostnamectl)

CentOS 7 ๋ฐ systemd ๊ธฐ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ hostnamectl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ํ›„ ์‰˜ ํ”„๋กฌํ”„ํŠธ์— ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ /etc/hosts ํŒŒ์ผ ์ˆ˜์ •์˜ ์ค‘์š”์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

ํ˜ธ์ŠคํŠธ๋„ค์ž„์€ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์„œ๋ฒ„๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” /etc/sysconfig/network ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ์žฌ๋ถ€ํŒ…ํ•ด์•ผ ํ–ˆ์œผ๋‚˜, CentOS 7๋ถ€ํ„ฐ๋Š” hostnamectl ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์žฌ๋ถ€ํŒ… ์—†์ด ์ฆ‰์‹œ ์„ค์ •์„ ์˜๊ตฌ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • System: systemd based

1. ํ˜ธ์ŠคํŠธ๋„ค์ž„ ๋ณ€๊ฒฝ (hostnamectl)

hostnamectl ๋ช…๋ น์€ ์ปค๋„ ํ˜ธ์ŠคํŠธ๋„ค์ž„ ์„ค์ •๊ณผ /etc/hostname ํŒŒ์ผ ์ˆ˜์ •์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ ํ™•์ธ

hostnamectl status

๋ณ€๊ฒฝ ๋ช…๋ น์–ด

# ๊ตฌ๋ฌธ: hostnamectl set-hostname [์ƒˆ๋กœ์šด_์ด๋ฆ„]
hostnamectl set-hostname web-server-01

2. ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ ๋ฐ ์ ์šฉ (Verification)

๋ช…๋ น์–ด ์‹คํ–‰ ์ฆ‰์‹œ ์‹œ์Šคํ…œ ์„ค์ •์€ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ, ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ํ„ฐ๋ฏธ๋„์˜ ํ”„๋กฌํ”„ํŠธ(Shell Prompt)์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ํ™•์ธ

# 1. ์„ค์ •๊ฐ’ ํ™•์ธ
hostname

# 2. ์ƒ์„ธ ํ™•์ธ
hostnamectl status

ํ„ฐ๋ฏธ๋„ ํ”„๋กฌํ”„ํŠธ ๊ฐฑ์‹ 

๋กœ๊ทธ์•„์›ƒ ํ›„ ๋‹ค์‹œ ๋กœ๊ทธ์ธ(Reconnect)ํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์žฌ์ ‘์† ์—†์ด ๋ฐ”๋กœ ํ™•์ธํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

# ํ˜„์žฌ ์‰˜ ์„ธ์…˜ ๊ฐฑ์‹ 
exec bash

๊ฒฐ๊ณผ: [root@old-name ~]# ์—์„œ [root@web-server-01 ~]# ๋กœ ๋ณ€๊ฒฝ๋จ.


3. ํ•„์ˆ˜ ํ›„์† ์กฐ์น˜: /etc/hosts ์ˆ˜์ •

ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด, ์„œ๋ฒ„ ์ž์‹ ์ด ์ž์‹ ์˜ ์ด๋ฆ„์„ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ปฌ DNS ์„ค์ • ํŒŒ์ผ์ธ /etc/hosts๋„ ๋ฐ˜๋“œ์‹œ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ˆ„๋ฝํ•˜๋ฉด sudo ๋ช…๋ น์–ด ์‹คํ–‰์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋™ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ˆ˜์ •

vi /etc/hosts

์ˆ˜์ • ๋‚ด์šฉ

๊ธฐ์กด ํ˜ธ์ŠคํŠธ๋„ค์ž„์ด ์ ํžŒ ๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# ๋ณ€๊ฒฝ๋œ ํ˜ธ์ŠคํŠธ๋„ค์ž„ ์ถ”๊ฐ€ (์ž์‹ ์˜ IP ๋˜๋Š” Loopback์— ๋งคํ•‘)
127.0.0.1   web-server-01
Tip: ํด๋Ÿฌ์Šคํ„ฐ๋ง(Cluster) ํ™˜๊ฒฝ์ด๋‚˜ WAS(WebSphere, JBoss) ํ™˜๊ฒฝ์—์„œ๋Š” 127.0.0.1 ๋Œ€์‹  ์‹ค์ œ ์„œ๋ฒ„์˜ ๊ณต์ธ IP(๋˜๋Š” ์‚ฌ์„ค IP)์— ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

[IBM HTTPServer] SSL/TLS ์•”ํ˜ธํ™” ์ŠˆํŠธ(Cipher Suite) ํ™•์ธ ๋ฐ ์ ๊ฒ€ ๋ฐฉ๋ฒ• (DUMP_SSL_CIPHERS)

IBM HTTP Server(IHS)์—์„œ ํ˜„์žฌ ์ ์šฉ๋œ SSL/TLS ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „๊ณผ ์ง€์›ํ•˜๋Š” ์•”ํ˜ธํ™” ์ŠˆํŠธ(Cipher Suite) ๋ชฉ๋ก์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. apachectl์˜ ์ง„๋‹จ ์˜ต์…˜์„ ํ†ตํ•ด ์„œ๋ฒ„์— ์„ค์ •๋œ ๋ณด์•ˆ ์ˆ˜์ค€์„ ์ ๊ฒ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

๋ณด์•ˆ ์ทจ์•ฝ์  ์ ๊ฒ€ ์‹œ "SSLv3๋‚˜ RC4 ๊ฐ™์€ ์•ฝํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ผ"๋Š” ๊ถŒ๊ณ ๋ฅผ ์ž์ฃผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์—, ํ˜„์žฌ ์›น ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์šฐ์„ ์ž…๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTPServer v8.5.0.0

1. Cipher Suite ํ™•์ธ ๋ช…๋ น์–ด

IHS๋Š” apachectl ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ์— -t(๋ฌธ๋ฒ• ๊ฒ€์‚ฌ) ์˜ต์…˜๊ณผ ํ•จ๊ป˜ -D DUMP_SSL_CIPHERS ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ, ํ˜„์žฌ ์„ค์ •๋œ SSL ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ์‹คํ–‰

cd [IHS_HOME]/bin

# SSL Cipher ์„ค์ • ๋คํ”„
./apachectl -t -D DUMP_SSL_CIPHERS

๊ฒฐ๊ณผ ์ถœ๋ ฅ ์˜ˆ์‹œ (Default ์ƒํƒœ)

๋ณ„๋„์˜ ๋ณด์•ˆ ์„ค์ •(Hardening)์ด ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด IHS ๋ฒ„์ „์˜ ๊ธฐ๋ณธ๊ฐ’(Default)๋“ค์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

SSL default cipher lists:
SSL protocol SSLV2, FIPS off, defaults = (None)
SSL protocol SSLV3, FIPS off, defaults = TLS_RSA_WITH_AES_128_CBC_SHA(2F), ...
SSL protocol TLSv10, FIPS off, defaults = TLS_RSA_WITH_AES_128_CBC_SHA(2F), ...
SSL protocol TLSv11, FIPS off, defaults = TLS_RSA_WITH_AES_128_CBC_SHA(2F), ...
SSL protocol TLSv12, FIPS off, defaults = TLS_RSA_WITH_AES_128_GCM_SHA256(9C), ...
Syntax OK
ํ•ด์„ ์ฃผ์˜ (Analysis):
์œ„ ์ถœ๋ ฅ ๊ฒฐ๊ณผ์— SSLV3 ํ•ญ๋ชฉ์ด ๋ณด์ธ๋‹ค๋ฉด, ํ˜„์žฌ ์„œ๋ฒ„๋Š” ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ SSLv3 ํ”„๋กœํ† ์ฝœ ํ†ต์‹ ์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ๋น„ํ™œ์„ฑํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ๊ต์ฐจ ๊ฒ€์ฆ (Verification)

์„œ๋ฒ„ ๋‚ด๋ถ€ ์„ค์ •๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€์—์„œ ์‹ค์ œ๋กœ ์ ‘์†์„ ์‹œ๋„ํ•˜์—ฌ ์–ด๋–ค Cipher๊ฐ€ ๋…ธ์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

1) nmap ์‚ฌ์šฉ (Linux)

nmap์˜ ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›ํ•˜๋Š” Cipher ๋ชฉ๋ก์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

nmap --script ssl-enum-ciphers -p 443 [์„œ๋ฒ„IP]

2) OpenSSL ์‚ฌ์šฉ

ํŠน์ • ํ”„๋กœํ† ์ฝœ๋กœ ์ ‘์†์ด ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

# SSLv3 ์ ‘์† ์‹œ๋„ (์ ‘์† ์‹คํŒจํ•ด์•ผ ์•ˆ์ „ํ•จ)
openssl s_client -connect [์„œ๋ฒ„IP]:443 -ssl3

3. ๋ณด์•ˆ ์„ค์ • ๊ฐ•ํ™” (Next Step)

์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ๊ณผ Cipher๋ฅผ ํ™•์ธํ–ˆ๋‹ค๋ฉด, httpd.conf ํŒŒ์ผ์—์„œ ์ด๋ฅผ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ์˜ˆ์‹œ (httpd.conf)

IHS์—์„œ๋Š” SSLCipherSpec ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • Cipher๋ฅผ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

<VirtualHost *:443>
    SSLEnable
    
    # 1. ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ ๋น„ํ™œ์„ฑํ™” (TLS 1.2๋งŒ ํ—ˆ์šฉ ๊ถŒ์žฅ)
    SSLProtocolDisable SSLv2 SSLv3 TLSv10 TLSv11
    SSLProtocolEnable TLSv12

    # 2. ๊ฐ•๋ ฅํ•œ Cipher Suite๋งŒ ํ—ˆ์šฉ (์˜ˆ์‹œ)
    # 128๋น„ํŠธ ๋ฏธ๋งŒ ์ฐจ๋‹จ, RC4/MD5 ์ฐจ๋‹จ
    SSLCipherSpec TLS_RSA_WITH_AES_128_CBC_SHA
    SSLCipherSpec TLS_RSA_WITH_AES_256_CBC_SHA
    # ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€...
</VirtualHost>

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