<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Application-Security on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/application-security/</link><description>Recent content in Application-Security on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 03 Aug 2026 04:25:25 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/application-security/index.xml" rel="self" type="application/rss+xml"/><item><title>Firewall vs WAF: Network Gatekeeper or Application-Layer Guard</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-firewall-vs-waf-network-gatekeeper-or-application-layer-guar/</link><pubDate>Mon, 03 Aug 2026 04:25:25 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-firewall-vs-waf-network-gatekeeper-or-application-layer-guar/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A firewall and a web application firewall (WAF) both filter traffic, but they operate at different layers of the stack. A firewall makes allow/deny decisions based on &lt;strong class="kw"&gt;IP and port&lt;/strong&gt;, while a WAF inspects the actual &lt;strong class="kw"&gt;HTTP payload&lt;/strong&gt; of requests to catch application-layer attacks like SQL injection and XSS. Most production environments deploy both, since neither can see what the other is built to catch.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="160" y="30" text-anchor="middle" font-size="18" style="fill:var(--primary)"&gt;Firewall&lt;/text&gt;&lt;text x="480" y="30" text-anchor="middle" font-size="18" style="fill:var(--primary)"&gt;WAF&lt;/text&gt;&lt;line x1="320" y1="45" x2="320" y2="335" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="4,4"/&gt;&lt;text x="160" y="58" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;Raw network traffic&lt;/text&gt;&lt;rect x="95" y="65" width="130" height="25" rx="3" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="82" text-anchor="middle" font-size="10" style="fill:var(--content)"&gt;TCP SYN, dst port 22&lt;/text&gt;&lt;line x1="160" y1="90" x2="160" y2="115" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;polygon points="155,112 165,112 160,120" style="fill:var(--compare-a)"/&gt;&lt;rect x="85" y="120" width="150" height="55" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="2"/&gt;&lt;text x="160" y="142" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Firewall&lt;/text&gt;&lt;text x="160" y="158" text-anchor="middle" font-size="9.5" style="fill:var(--secondary)"&gt;L3/L4: IP, port, protocol&lt;/text&gt;&lt;line x1="160" y1="175" x2="122" y2="200" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;line x1="160" y1="175" x2="197" y2="200" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="90" y="200" width="65" height="28" rx="3" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="122" y="218" text-anchor="middle" font-size="9.5" style="fill:var(--content)"&gt;Allow 443&lt;/text&gt;&lt;rect x="165" y="200" width="65" height="28" rx="3" style="fill:none;stroke:var(--compare-a)" stroke-width="1.5" stroke-dasharray="3,3"/&gt;&lt;text x="197" y="218" text-anchor="middle" font-size="9.5" style="fill:var(--content)"&gt;Block 22&lt;/text&gt;&lt;text x="160" y="252" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;Cannot see inside the&lt;/text&gt;&lt;text x="160" y="266" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;HTTP request body&lt;/text&gt;&lt;text x="480" y="55" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;HTTP request&lt;/text&gt;&lt;rect x="395" y="65" width="170" height="25" rx="3" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="82" text-anchor="middle" font-size="9" style="fill:var(--content)"&gt;GET /login?id=1' OR '1'='1&lt;/text&gt;&lt;line x1="480" y1="90" x2="480" y2="115" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;polygon points="475,112 485,112 480,120" style="fill:var(--compare-b)"/&gt;&lt;rect x="405" y="120" width="150" height="55" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="2"/&gt;&lt;text x="480" y="142" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;WAF&lt;/text&gt;&lt;text x="480" y="158" text-anchor="middle" font-size="9.5" style="fill:var(--secondary)"&gt;L7: URL, headers, body&lt;/text&gt;&lt;line x1="480" y1="175" x2="442" y2="200" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;line x1="480" y1="175" x2="517" y2="200" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="410" y="200" width="65" height="28" rx="3" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="442" y="218" text-anchor="middle" font-size="9.5" style="fill:var(--content)"&gt;Allow normal&lt;/text&gt;&lt;rect x="485" y="200" width="65" height="28" rx="3" style="fill:none;stroke:var(--compare-b)" stroke-width="1.5" stroke-dasharray="3,3"/&gt;&lt;text x="517" y="218" text-anchor="middle" font-size="9.5" style="fill:var(--content)"&gt;Block SQLi&lt;/text&gt;&lt;text x="480" y="252" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;Decrypts TLS to inspect&lt;/text&gt;&lt;text x="480" y="266" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;the request payload&lt;/text&gt;&lt;text x="320" y="310" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;Layered defense: firewall blocks unauthorized access, WAF blocks malicious payloads&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Firewall&lt;/th&gt;
&lt;th&gt;WAF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OSI layer inspected&lt;/td&gt;
&lt;td&gt;Network/transport (L3/L4)&lt;/td&gt;
&lt;td&gt;Application (L7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic filtered&lt;/td&gt;
&lt;td&gt;All IP traffic, any protocol or port&lt;/td&gt;
&lt;td&gt;HTTP/HTTPS requests only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspection criteria&lt;/td&gt;
&lt;td&gt;Source/destination IP, port, protocol, connection state&lt;/td&gt;
&lt;td&gt;URL, headers, cookies, and request body content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule basis&lt;/td&gt;
&lt;td&gt;Static allow/deny rules and ACLs&lt;/td&gt;
&lt;td&gt;Signature and behavioral rules for known attack patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical deployment point&lt;/td&gt;
&lt;td&gt;Network perimeter or between internal subnets&lt;/td&gt;
&lt;td&gt;In front of or alongside web servers/load balancers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attacks stopped&lt;/td&gt;
&lt;td&gt;Port scans, unauthorized network access, network-layer floods&lt;/td&gt;
&lt;td&gt;SQL injection, XSS, CSRF, other OWASP Top 10 exploits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encrypted traffic handling&lt;/td&gt;
&lt;td&gt;Sees only packet headers, not TLS-encrypted payload&lt;/td&gt;
&lt;td&gt;Typically terminates TLS to inspect decrypted HTTP content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance cadence&lt;/td&gt;
&lt;td&gt;Relatively static rule sets, infrequent changes&lt;/td&gt;
&lt;td&gt;Frequent signature updates as new exploits are discovered&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A firewall filters at the &lt;strong class="kw"&gt;network layer&lt;/strong&gt; using IP and port, while a WAF filters at the &lt;strong class="kw"&gt;application layer&lt;/strong&gt; using HTTP content.&lt;/li&gt;
&lt;li&gt;Firewalls control which connections are permitted; WAFs inspect the &lt;strong class="kw"&gt;payload&lt;/strong&gt; within connections already allowed through.&lt;/li&gt;
&lt;li&gt;A WAF typically must &lt;strong class="kw"&gt;decrypt TLS&lt;/strong&gt; to read requests, whereas a firewall generally cannot see inside encrypted traffic.&lt;/li&gt;
&lt;li&gt;The two are &lt;strong class="kw"&gt;complementary&lt;/strong&gt; controls, not substitutes — each blocks a different class of attack the other misses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Firewall&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>