๐Ÿ” ์›น์‚ฌ์ดํŠธ ๊ธฐ์ˆ  ์Šคํƒ์€ ์–ด๋–ป๊ฒŒ ํƒ์ง€๋ ๊นŒ? โ€” Wappalyzer ๋™์ž‘ ์›๋ฆฌ์™€ ๋ณด์•ˆ ๊ด€์  ๋ถ„์„

@leekh8 ยท March 30, 2026 ยท 8 min read

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ํ•œ ๋ฒˆ์ฏค ์ด๋Ÿฐ ๊ฒฝํ—˜์„ ํ•œ๋‹ค.

ํฌ๋กฌ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ํ•˜๋‚˜ ์„ค์น˜ํ•ด๋†จ๋”๋‹ˆ ๋ฐฉ๋ฌธํ•˜๋Š” ์‚ฌ์ดํŠธ๋งˆ๋‹ค "React 18 ยท Node.js ยท Nginx ยท Cloudflare"๋ผ๊ณ  ์ฒ™์ฒ™ ์•Œ๋ ค์ค€๋‹ค. ์–ด๋–ป๊ฒŒ ์•„๋Š” ๊ฑธ๊นŒ?

๋ณด์•ˆ ์ชฝ ์ผ์„ ํ•˜๋‹ค ๋ณด๋‹ˆ ์ด ์งˆ๋ฌธ์ด ๋‹จ์ˆœํ•œ ํ˜ธ๊ธฐ์‹ฌ์„ ๋„˜์–ด์„œ๊ฒŒ ๋๋‹ค. ์ด ๊ธฐ์ˆ ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ฉด, ๋‚ด ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€์— ์–ด๋–ค ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๊ฒŒ ์–ด๋–ค ๋ณด์•ˆ ๋ฆฌ์Šคํฌ๋กœ ์—ฐ๊ฒฐ๋˜๋Š”์ง€๊นŒ์ง€ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Wappalyzer์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋ถ„ํ•ดํ•ด์„œ ์‚ดํŽด๋ณด๊ณ , ๊ฐœ๋ฐœ์ž ๊ด€์ ๊ณผ ๋ณด์•ˆ ๊ด€์ ์—์„œ ๊ฐ๊ฐ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.


Wappalyzer๊ฐ€ ๋ญ”๊ฐ€?

Wappalyzer๋Š” ์›น์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ž๋™์œผ๋กœ ์‹๋ณ„ํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ๋‹ค.1

๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ, CLI ๋„๊ตฌ, API ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์‹œ ์–ด๋–ค CMS, ํ”„๋ ˆ์ž„์›Œํฌ, ์„œ๋ฒ„, ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์“ฐ๋Š”์ง€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒŒ์•…ํ•œ๋‹ค.

์ง์ ‘์ ์ธ ํ™œ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์–‘ํ•˜๋‹ค:

  • ๊ฒฝ์Ÿ์‚ฌ ๋ถ„์„: ๊ฒฝ์Ÿ์‚ฌ ์‚ฌ์ดํŠธ๊ฐ€ ์–ด๋–ค ๊ธฐ์ˆ ์„ ์“ฐ๋Š”์ง€ ํŒŒ์•…
  • ์˜์—…/๋งˆ์ผ€ํŒ…: ํŠน์ • ๊ธฐ์ˆ  ์Šคํƒ์„ ์“ฐ๋Š” ๊ธฐ์—… ๋ฆฌ์ŠคํŠธ ์ถ”์ถœ
  • ๋ณด์•ˆ ๋ถ„์„: ์ทจ์•ฝํ•œ ๋ฒ„์ „์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ƒ ์‹๋ณ„
  • ๊ฐœ๋ฐœ ์ฐธ๊ณ : ์ž˜ ๋งŒ๋“  ์‚ฌ์ดํŠธ์˜ ๊ธฐ์ˆ  ์Šคํƒ ๋ฒค์น˜๋งˆํ‚น

๊ทธ๋Ÿฐ๋ฐ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ โ€” ๋ณด์•ˆ ๋ถ„์„ โ€” ์ด ๋ถ€๋ถ„์ด ํ•ต์‹ฌ์ด๋‹ค. ๊ณต๊ฒฉ์ž ์ž…์žฅ์—์„œ๋„ ๋˜‘๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


์–ด๋–ป๊ฒŒ ํƒ์ง€ํ•˜๋Š”๊ฐ€ โ€” ํ•‘๊ฑฐํ”„๋ฆฐํŒ…์˜ ์›๋ฆฌ

Wappalyzer๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ **ํ•‘๊ฑฐํ”„๋ฆฐํŠธ(Fingerprint)**๋ฅผ ์กฐํ•ฉํ•ด์„œ ๊ธฐ์ˆ ์„ ์‹๋ณ„ํ•œ๋‹ค.

ํ•‘๊ฑฐํ”„๋ฆฐํŠธ๋ž€ ํŠน์ • ๊ธฐ์ˆ ์ด ๋‚จ๊ธฐ๋Š” ๊ณ ์œ ํ•œ ํ”์ ์ด๋‹ค. ์‚ฌ๋žŒ์˜ ์ง€๋ฌธ์ฒ˜๋Ÿผ, ์†Œํ”„ํŠธ์›จ์–ด๋„ HTTP ์‘๋‹ต, HTML ๊ตฌ์กฐ, ์ฟ ํ‚ค, JavaScript ๋ณ€์ˆ˜ ๋“ฑ ๊ณณ๊ณณ์— ์ž์‹ ๋งŒ์˜ ํ”์ ์„ ๋‚จ๊ธด๋‹ค.

๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ
HTTP ์š”์ฒญ/์‘๋‹ต
HTTP ํ—ค๋”

headers
HTML ์†Œ์Šค

meta / script / link
JavaScript

์ „์—ญ ๋ณ€์ˆ˜ ยท ๊ฐ์ฒด
DOM ๊ตฌ์กฐ

ํด๋ž˜์Šค ยท ์†์„ฑ
์ฟ ํ‚ค

cookies
URL ํŒจํ„ด

url
๊ทœ์น™ ๋งค์นญ

technologiesDB
๊ธฐ์ˆ  ์Šคํƒ ์‹๋ณ„

์ด๋ฆ„ ยท ๋ฒ„์ „ ยท ์นดํ…Œ๊ณ ๋ฆฌ

๊ฐ ํƒ์ง€ ๋ฒกํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.


ํƒ์ง€ ๋ฒกํ„ฐ 1: HTTP ํ—ค๋”

๊ฐ€์žฅ ์ง์ ‘์ ์ธ ์ •๋ณด ์†Œ์Šค๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ๋ณด๋‚ผ ๋•Œ ํฌํ•จํ•˜๋Š” HTTP ํ—ค๋”์—๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค.

HTTP/1.1 200 OK
Server: nginx/1.24.0
X-Powered-By: PHP/8.1.27
X-Generator: WordPress 6.4.3
Set-Cookie: PHPSESSID=abc123; Path=/

์ด ์‘๋‹ต ํ•˜๋‚˜๋งŒ์œผ๋กœ Wappalyzer๋Š” Nginx, PHP, WordPress ๋ฒ„์ „๊นŒ์ง€ ํŒŒ์•…ํ•œ๋‹ค.

Wappalyzer์˜ ๊ทœ์น™ ํŒŒ์ผ์€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ •์˜๋œ๋‹ค:

{
  "Nginx": {
    "headers": {
      "Server": "nginx(?:/([\\d.]+))?\\;version:\\1"
    }
  },
  "PHP": {
    "headers": {
      "X-Powered-By": "php(?:/([\\d.]+))?\\;version:\\1"
    }
  }
}

\;version:\1์€ Wappalyzer ์ „์šฉ ๋ฌธ๋ฒ•์œผ๋กœ, ์ •๊ทœ์‹ ์บก์ฒ˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์ถ”์ถœํ•˜๋ผ๋Š” ์˜๋ฏธ๋‹ค.

๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ: Server, X-Powered-By, X-Generator ๊ฐ™์€ ํ—ค๋”๋Š” ์‹ค์ œ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์ด ํ—ค๋”๋“ค์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ฒ„์ „ ์ •๋ณด ๋…ธ์ถœ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.


ํƒ์ง€ ๋ฒกํ„ฐ 2: HTML ๋ฉ”ํƒ€ ํƒœ๊ทธ์™€ ์†Œ์Šค ์ฝ”๋“œ

HTML ์†Œ์Šค์—๋„ ๊ธฐ์ˆ  ํ”์ ์ด ๋‚จ๋Š”๋‹ค.

<meta name="generator" content="WordPress 6.4.3" />
<link rel="stylesheet" href="/wp-content/themes/twentytwentythree/style.css" />
<script src="/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>

URL ๊ฒฝ๋กœ ํŒจํ„ด(/wp-content/, /wp-includes/)๋งŒ์œผ๋กœ๋„ WordPress ์‹๋ณ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฒ„์ „ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ(?ver=3.7.1)๊นŒ์ง€ ์žˆ์œผ๋ฉด ๋ฒ„์ „๋„ ํŠน์ •๋œ๋‹ค.

Wappalyzer ๊ทœ์น™ ์˜ˆ์‹œ:

{
  "WordPress": {
    "html": "<link[^>]+/wp-content/",
    "meta": {
      "generator": "WordPress(?:/([\\d.]+))?\\;version:\\1"
    },
    "scripts": "wp-content"
  }
}

์ •์  HTML๋งŒ์œผ๋กœ ์ƒ๋‹นํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋ฒกํ„ฐ๋Š” headless ๋ธŒ๋ผ์šฐ์ € ์—†์ด๋„ ๋™์ž‘ํ•œ๋‹ค.


ํƒ์ง€ ๋ฒกํ„ฐ 3: JavaScript ์ „์—ญ ๋ณ€์ˆ˜

ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” JavaScript ๋Ÿฐํƒ€์ž„์— ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด๋ฅผ ๋‚จ๊ธด๋‹ค. ์ด๊ฑด HTTP ์‘๋‹ต์ด๋‚˜ HTML ๋ถ„์„๋งŒ์œผ๋กœ๋Š” ์žก๊ธฐ ์–ด๋ ต๊ณ , ์‹ค์ œ๋กœ JavaScript๋ฅผ ์‹คํ–‰ํ•ด์•ผ ๋ณด์ธ๋‹ค.

// React๊ฐ€ ์žˆ์œผ๋ฉด window.__REACT_DEVTOOLS_GLOBAL_HOOK__ ์กด์žฌ
// Vue.js๊ฐ€ ์žˆ์œผ๋ฉด window.Vue ์กด์žฌ
// Next.js๊ฐ€ ์žˆ์œผ๋ฉด window.__NEXT_DATA__ ์กด์žฌ

if (window.__NEXT_DATA__) {
  // Next.js ํ™•์ธ
  const version = window.__NEXT_DATA__.buildId; // ๋นŒ๋“œ ์ •๋ณด ํฌํ•จ
}

Wappalyzer ๊ทœ์น™:

{
  "Next.js": {
    "js": {
      "__NEXT_DATA__": ""
    }
  },
  "Vue.js": {
    "js": {
      "Vue.version": "([\\d.]+)\\;version:\\1"
    }
  }
}

์ด ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ๋ฒ„์ „์˜ Wappalyzer๋Š” CLI ๋ฒ„์ „๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ๊ธฐ์ˆ ์„ ํƒ์ง€ํ•œ๋‹ค. CLI๋Š” ์ •์  HTML๋งŒ ๋ถ„์„ํ•˜์ง€๋งŒ, ํ™•์žฅ์€ JavaScript๊นŒ์ง€ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


ํƒ์ง€ ๋ฒกํ„ฐ 4: DOM ๊ตฌ์กฐ

DOM ์š”์†Œ์˜ ํด๋ž˜์Šค๋ช…, ์†์„ฑ, ๊ตฌ์กฐ๋„ ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

  • Angular: <app-root>, ng-version ์†์„ฑ
  • Vue: data-v- ์ ‘๋‘์‚ฌ ์†์„ฑ (SFC scoped CSS)
  • Bootstrap: class="container-fluid", class="navbar navbar-expand-lg"
{
  "Angular": {
    "dom": {
      "head > meta[name=viewport]": {
        "attributes": {
          "ng-version": "([\\d.]+)\\;version:\\1"
        }
      }
    }
  }
}

ํƒ์ง€ ๋ฒกํ„ฐ 5: ์ฟ ํ‚ค

์ฟ ํ‚ค ์ด๋ฆ„๋„ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์„œ๋ฒ„ ๊ธฐ์ˆ ์„ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.

์ฟ ํ‚ค๋ช… ์˜๋ฏธ
PHPSESSID PHP ์„ธ์…˜
JSESSIONID Java (Spring, Tomcat ๋“ฑ)
_ga, _gid Google Analytics
connect.sid Express.js (Node.js)
wp-settings-* WordPress ๋กœ๊ทธ์ธ ์„ธ์…˜
laravel_session Laravel (PHP)
{
  "Laravel": {
    "cookies": {
      "laravel_session": ""
    }
  }
}

๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ณธ๊ฐ’ ์ฟ ํ‚ค๋ช…์„ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ๊ธฐ์ˆ  ์Šคํƒ์ด ๋ฐ”๋กœ ๋…ธ์ถœ๋œ๋‹ค.


ํƒ์ง€ ๋ฒกํ„ฐ 6: ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ URL

CDN์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ URL๋„ ๊ฐ•๋ ฅํ•œ ํƒ์ง€ ํฌ์ธํŠธ๋‹ค.

<script src="https://cdn.jsdelivr.net/npm/vue@3.3.4/dist/vue.global.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>

URL ํŒจํ„ด ์ž์ฒด๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ฒ„์ „์„ ์ง์ ‘ ์•Œ๋ ค์ค€๋‹ค.


์ปค๋ฒ„๋ฆฌ์ง€: ์ •์  ํƒ์ง€ vs ๋™์  ํƒ์ง€

ํฅ๋ฏธ๋กœ์šด ์ง€์ ์ด ์žˆ๋‹ค. headless ๋ธŒ๋ผ์šฐ์ € ์—†์ด HTML๋งŒ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Wappalyzer ๊ทœ์น™ ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ„์„ํ•˜๋ฉด, ํƒ์ง€ ๋ฒกํ„ฐ๋ณ„ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๋Œ€๋žต ์ด๋ ‡๋‹ค:

๋ฐฉ๋ฒ• ํƒ์ง€ ๊ฐ€๋Šฅ ๋ฒ”์œ„ ๋น„๊ณ 
HTTP ํ—ค๋” ๋ถ„์„ ~60% curl ์ˆ˜์ค€์œผ๋กœ ๊ฐ€๋Šฅ
HTML ์ •์  ํŒŒ์‹ฑ ~75% <meta>, <script src>, ๊ฒฝ๋กœ ํŒจํ„ด
HTML + script inline ๋ถ„์„ ~85% <script> ๋‚ด๋ถ€ ์„ ์–ธ ํฌํ•จ
JavaScript ์‹คํ–‰ ~97% ์ „์—ญ ๋ณ€์ˆ˜, DOM ์†์„ฑ ์™„์ „ ์ปค๋ฒ„

ํ—ค๋” + HTML ์ •์  ๋ถ„์„๋งŒ์œผ๋กœ๋„ ์ „์ฒด์˜ 70~80%๋ฅผ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด์ง€ ์•Š์•„๋„, ์Šคํฌ๋ž˜ํผ๊ฐ€ ์‚ฌ์ดํŠธ๋ฅผ ํ•œ ๋ฒˆ ๊ธ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ƒ๋‹นํ•œ ๊ธฐ์ˆ  ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค.


๋ณด์•ˆ ๊ด€์ : CPE์™€ CVE ์—ฐ๊ฒฐ

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์ž๋ณด๋‹ค๋Š” ๋ณด์•ˆ ๋‹ด๋‹น์ž ์‹œ๊ฐ์ด ํ•„์š”ํ•˜๋‹ค.

Wappalyzer๊ฐ€ ํƒ์ง€ํ•œ ๊ธฐ์ˆ  ์ •๋ณด๋Š” **CPE(Common Platform Enumeration)**๋ผ๋Š” ํ‘œ์ค€ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

CPE๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ํ‘œ์ค€ ๋ช…๋ช… ์ฒด๊ณ„๋‹ค:

cpe:2.3:a:nginx:nginx:1.24.0:*:*:*:*:*:*:*
cpe:2.3:a:wordpress:wordpress:6.4.3:*:*:*:*:*:*:*
cpe:2.3:a:php:php:8.1.27:*:*:*:*:*:*:*

๊ทธ๋ฆฌ๊ณ  CVE(Common Vulnerabilities and Exposures) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด CPE๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ทจ์•ฝ์ ์„ ๋งคํ•‘ํ•œ๋‹ค.

์ฆ‰, ํ๋ฆ„์ด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค:

ํ—ค๋”, HTML,

์ฟ ํ‚ค, ์Šคํฌ๋ฆฝํŠธ
nginx 1.24

WordPress 6.4

PHP 8.1
cpe:2.3:a:nginx:nginx:1.24

cpe:2.3:a:wordpress:wordpress:6.4
CVE-2024-XXXXX

CVE-2024-YYYYY
๋Œ€์ƒ ์„œ๋ฒ„

HTTP ์‘๋‹ต
Wappalyzer

๊ธฐ์ˆ  ์‹๋ณ„
CPE ๋ณ€ํ™˜
์ทจ์•ฝ์  DB

NVD / OpenVAS
์ทจ์•ฝ์  ๋ฆฌํฌํŠธ

๊ณต๊ฒฉ์ž ์ž…์žฅ์—์„œ๋Š” Wappalyzer๋กœ ๊ธฐ์ˆ  ์Šคํƒ์„ ํŒŒ์•…ํ•˜๊ณ , ํ•ด๋‹น ๋ฒ„์ „์˜ CVE๋ฅผ ์กฐํšŒํ•˜๊ณ , ํŒจ์น˜๋˜์ง€ ์•Š์€ ๋ฒ„์ „์ด๋ฉด ์ทจ์•ฝ์  ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•˜๋Š” ํ๋ฆ„์ด ์ž๋™ํ™”๋  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ Wappalyzer์—์„œ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ์ค‘ CPE๊ฐ€ ๋งคํ•‘๋˜์–ด ์žˆ๋Š” ๊ฒƒ๋งŒ ํ•ด๋„ ์ˆ˜๋ฐฑ ๊ฐœ๊ฐ€ ๋„˜๊ณ , ๊ฐ ๊ธฐ์ˆ ๋งˆ๋‹ค ์ˆ˜์‹ญ์—์„œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ CVE๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ํŠนํžˆ PHP, WordPress, Joomla, Drupal ๊ฐ™์€ CMS ๊ณ„์—ด๊ณผ OpenSSL, Tomcat, Jenkins ๊ฐ™์€ ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด๋Š” CVE ์—ฐ๊ด€๋„๊ฐ€ ๋†’๋‹ค.2


ํƒ์ง€ ๊ทœ์น™ DB๋Š” ์˜คํ”ˆ์†Œ์Šค๋‹ค

Wappalyzer์˜ ๊ธฐ์ˆ  ํƒ์ง€ ๊ทœ์น™์€ ๋ชจ๋‘ ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค.3

์›๋ž˜์˜ Wappalyzer ํ”„๋กœ์ ํŠธ๋Š” 2023๋…„ ์ƒ์—…ํ™”๋กœ ๋ฐฉํ–ฅ์„ ์ „ํ™˜ํ–ˆ์ง€๋งŒ, enthec(๊ตฌ wappalyzergo)์™€ ๊ฐ™์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํฌํฌ๋“ค์ด ์˜คํ”ˆ์†Œ์Šค ๋ฒ„์ „์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค.4

๊ทœ์น™ DB ๊ตฌ์กฐ๋Š” JSON ํŒŒ์ผ ํ˜•ํƒœ๋กœ, ํƒ์ง€ ๋Œ€์ƒ ๊ธฐ์ˆ ๋ณ„๋กœ ํ•‘๊ฑฐํ”„๋ฆฐํŠธ ํŒจํ„ด์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค:

{
  "React": {
    "cats": [12],
    "description": "React is an open-source JavaScript library...",
    "dom": {
      "[data-reactroot]": { "exists": "" },
      "[data-reactid]": { "exists": "" }
    },
    "js": {
      "React.version": "([\\d.]+)\\;version:\\1",
      "react.version": "([\\d.]+)\\;version:\\1"
    },
    "scriptSrc": "react(?:\\.min)?\\.js",
    "website": "https://reactjs.org"
  }
}

์ด JSON ํ•˜๋‚˜๊ฐ€ React๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ชจ๋“  ๊ทœ์น™์„ ๋‹ด๊ณ  ์žˆ๋‹ค. DOM ์†์„ฑ, JavaScript ์ „์—ญ ๋ณ€์ˆ˜, ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ๊นŒ์ง€ ๋ณต์ˆ˜์˜ ๋ฒกํ„ฐ๋ฅผ ์กฐํ•ฉํ•ด์„œ ํ™•์‹ ๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ์‹์ด๋‹ค.


๊ฐœ๋ฐœ์ž ๊ด€์ : ๋‚ด ์‚ฌ์ดํŠธ๋Š” ๋ฌด์—‡์„ ๋…ธ์ถœํ•˜๊ณ  ์žˆ๋‚˜?

์ง€๊ธˆ ์šด์˜ ์ค‘์ด๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ ์ค‘์ธ ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€์— ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋น ๋ฅธ ํ™•์ธ ๋ฐฉ๋ฒ•

# ํ—ค๋” ํ™•์ธ
curl -I https://yourdomain.com

# ์‘๋‹ต ํ—ค๋” + ์ฒซ ๋ฒˆ์งธ HTML ํ™•์ธ
curl -s https://yourdomain.com | head -50

๋˜๋Š” Wappalyzer ์›น์‚ฌ์ดํŠธ์—์„œ URL ์ž…๋ ฅ๋งŒ์œผ๋กœ๋„ ๊ธฐ์ˆ  ์Šคํƒ์„ ๋ถ„์„ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋…ธ์ถœ ์ค„์ด๊ธฐ โ€” ์‹ค์šฉ์ ์ธ ์„ค์ •

Nginx์—์„œ ๋ฒ„์ „ ์ˆจ๊ธฐ๊ธฐ:

server_tokens off;
# ๋˜๋Š” ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ
more_clear_headers Server;

Apache์—์„œ ๋ฒ„์ „ ์ˆจ๊ธฐ๊ธฐ:

ServerTokens Prod
ServerSignature Off

PHP X-Powered-By ์ œ๊ฑฐ:

# php.ini
expose_php = Off

Express.js์—์„œ X-Powered-By ์ œ๊ฑฐ:

app.disable('x-powered-by');
// ๋˜๋Š” ํ—ฌ๋ฉง ์‚ฌ์šฉ (๊ถŒ์žฅ)
import helmet from 'helmet';
app.use(helmet());

WordPress generator ๋ฉ”ํƒ€ํƒœ๊ทธ ์ œ๊ฑฐ (functions.php):

remove_action('wp_head', 'wp_generator');

ํ•œ๊ณ„์™€ ์˜คํƒ ๊ฐ€๋Šฅ์„ฑ

Wappalyzer๊ฐ€ ํ•ญ์ƒ ์ •ํ™•ํ•œ ๊ฑด ์•„๋‹ˆ๋‹ค.

์˜คํƒ์ด ์ƒ๊ธฐ๋Š” ์ด์œ :

  • ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์ด ๋น„์Šทํ•œ ํŒจํ„ด์„ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ (์˜ˆ: jQuery๋ฅผ ์“ฐ๋Š” ์ˆ˜๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ)
  • ๋ฒ„์ „์ด ๋‚œ๋…ํ™”๋˜๊ฑฐ๋‚˜ ๋นŒ๋“œ ํ•ด์‹œ๋กœ ๋Œ€์ฒด๋œ ๊ฒฝ์šฐ (Webpack, Vite ๋“ฑ ๋ฒˆ๋“ค๋Ÿฌ ์‚ฌ์šฉ ์‹œ)
  • CDN ๊ฒฝ์œ ๋กœ ์‘๋‹ต ํ—ค๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ

ํƒ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ:

  • ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ๊ธฐ์ˆ  (DB, ์บ์‹œ ์„œ๋ฒ„ ๋“ฑ)
  • ์‘๋‹ต์— ํ”์ ์„ ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๋ฏธ๋“ค์›จ์–ด
  • ์ปค์Šคํ…€ ๋นŒ๋“œ๋กœ ๋””ํดํŠธ ํŒจํ„ด์„ ์ œ๊ฑฐํ•œ ๊ฒฝ์šฐ

๊ฒฐ๊ตญ ํƒ์ง€ ํšŒํ”ผ๋Š” "๊ณต๊ฒฉ ํ‘œ๋ฉด(Attack Surface)์„ ์ค„์ด๋Š” ๊ฒƒ"์ด๊ณ , ์™„๋ฒฝํ•œ ์€๋‹‰๋ณด๋‹ค๋Š” ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒŒ ํ˜„์‹ค์ ์ด๋‹ค.


์ •๋ฆฌํ•˜๋ฉฐ

Wappalyzer ๊ฐ™์€ ๊ธฐ์ˆ  ํ•‘๊ฑฐํ”„๋ฆฐํŒ… ๋„๊ตฌ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๊ณต๊ฒฉ์ž๋„ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์›น ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์ด ๊ธ€์˜ ํ•ต์‹ฌ์€ ์ด๋ ‡๋‹ค:

  1. ์„œ๋ฒ„ ํ—ค๋”์—์„œ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜๋ผ โ€” Server:, X-Powered-By: ๋“ฑ
  2. ๊ธฐ๋ณธ ์ฟ ํ‚ค๋ช…์„ ๋ฐ”๊ฟ”๋ผ โ€” JSESSIONID, PHPSESSID ๋“ฑ
  3. ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์“ฐ๋ฉด JS ์ „์—ญ ๋…ธ์ถœ์ด ์ค„์–ด๋“ ๋‹ค โ€” React, Vue๋ฅผ ๋ฒˆ๋“ค๋งํ•˜๋ฉด window.Vue ๊ฐ™์€ ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค
  4. ํŒจ์น˜๋ฅผ ๋ฏธ๋ฃจ์ง€ ๋งˆ๋ผ โ€” ๋ฒ„์ „์ด ๋…ธ์ถœ๋˜๋“  ์•ˆ ๋˜๋“ , ํŒจ์น˜๋˜์ง€ ์•Š์€ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋ฆฌ์Šคํฌ๋‹ค

ํƒ์ง€ ์ž์ฒด๋ฅผ ๋ง‰๋Š” ๊ฑด ์–ด๋ ต๋‹ค. ํ•˜์ง€๋งŒ ํƒ์ง€๋˜๋”๋ผ๋„ ์ตœ์‹  ํŒจ์น˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด, CVE ์กฐํšŒ์—์„œ ํ•ด๋‹น ๋ฒ„์ „์˜ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ ์ด ์—†๋‹ค๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋ณด์•ˆ์€ ์€ํ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ด€๋ฆฌ๋‹ค.


์ฐธ๊ณ ๋ฌธํ—Œ


  1. Wappalyzer. "About Wappalyzer." https://www.wappalyzer.com/aboutโ†ฉ
  2. NVD (National Vulnerability Database). "CVE Search." NIST. https://nvd.nist.gov/vuln/searchโ†ฉ
  3. Wappalyzer GitHub. "Technologies Database." https://github.com/enthec/webappanalyzer/tree/main/src/technologiesโ†ฉ
  4. enthec. "webappanalyzer โ€” Open-source Wappalyzer fork." GitHub. https://github.com/enthec/webappanalyzerโ†ฉ
@leekh8
๋ณด์•ˆ, ์›น ๊ฐœ๋ฐœ, Python์„ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ