์น ์๋ฒ ์ด์ ์ ๋ณด์ ์ทจ์ฝ์ (ํ์ผ ๋ณ์กฐ, ์ ๋ณด ๋ ธ์ถ ๋ฑ)์ ๋ฐฉ์งํ๊ธฐ ์ํด GET, POST๋ฅผ ์ ์ธํ ๋ถํ์ํ HTTP Method(PUT, DELETE, TRACE, OPTIONS)๋ฅผ ์ฐจ๋จํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค. IBM HTTP Server(Apache) ์ค์ ๊ณผ WAS(web.xml) ์ค์ ๋ ๊ฐ์ง ๋ฐฉ์์ ๋ค๋ฃน๋๋ค.
0. ๋ฐฐ๊ฒฝ ์ง์ (Context)
๊ธฐ๋ณธ์ ์ผ๋ก ์น ์๋ฒ๋ ๋ค์ํ HTTP Method๋ฅผ ์ง์ํ์ง๋ง, ์ค์ ์๋น์ค์์๋ ๋๋ถ๋ถ GET๊ณผ POST๋ง ์ฌ์ฉํฉ๋๋ค. ๋ถํ์ํ ๋ฉ์๋๋ฅผ ์ด์ด๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ณด์ ์ํ์ด ์์ต๋๋ค.
- PUT, DELETE: ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ์๋ฒ์ ํ์ผ์ ์์ฑ, ์์ , ์ญ์ ํ ์ ์์.
- TRACE: XST(Cross-Site Tracing) ๊ณต๊ฒฉ์ ์ ์ฉ๋์ด ์ฟ ํค/์ธ์ ์ ๋ณด๊ฐ ํ์ทจ๋ ์ ์์.
- OPTIONS: ์๋ฒ๊ฐ ์ง์ํ๋ ๋ฉ์๋ ์ ๋ณด๋ฅผ ๋ ธ์ถํจ.
Test Environment
- OS: CentOS 7.2
- Web Server: IBM HTTP Server v8.5 (Apache 2.2 Base)
1. Web Server ๋ ๋ฒจ ์ฐจ๋จ (httpd.conf)
๊ฐ์ฅ ์๋จ์ ์น ์๋ฒ์์ ์์ฒ ์ฐจ๋จํ๋ ๊ฒ์ด ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ๋ง๊ณ ์์ ํฉ๋๋ค. ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ์ ์ฉํ์ญ์์ค.
Method A: LimitExcept ์ง์์ด ์ฌ์ฉ (๊ถ์ฅ)
ํน์ ๋๋ ํ ๋ฆฌ๋ URL ํจํด์ ๋ํด ํ์ฉํ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ๋๋จธ์ง๋ ๊ฑฐ๋ถํ๋ ๋ฐฉ์์ ๋๋ค.
# 1. ํน์ ๋๋ ํ ๋ฆฌ ๊ธฐ์ค ์ฐจ๋จ
<Directory "/WAS/htdocs">
Options FollowSymLinks
AllowOverride None
# GET, POST๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฉ์๋ ๊ฑฐ๋ถ
<LimitExcept GET POST>
Order allow,deny
Deny from all
</LimitExcept>
</Directory>
# 2. ์ ์ญ(URL) ๊ธฐ์ค ์ฐจ๋จ (Directory ์ค์ ์ด ๋ชจํธํ ๋)
<Location "/*">
<LimitExcept GET POST>
Order allow,deny
Deny from all
</LimitExcept>
</Location>
IHS v8.5(Apache 2.2)๋
Order/Deny๋ฅผ ์ฌ์ฉํ์ง๋ง, IHS v9.0(Apache 2.4) ์ด์์์๋ Require all denied ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Method B: Mod_Rewrite ์ฌ์ฉ
mod_rewrite ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ์กฐ๊ฑด์ ๊ฒ์ฌํ๊ณ ๊ฐ์ ๋ก ์๋ฌ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์
๋๋ค.
LoadModule rewrite_module modules/mod_rewrite.so
<IfModule mod_rewrite.c>
RewriteEngine On
# ์กฐ๊ฑด: ์์ฒญ ๋ฉ์๋๊ฐ GET ๋๋ POST๊ฐ ์๋๋ผ๋ฉด
RewriteCond %{REQUEST_METHOD} !^(GET|POST)
# ๊ท์น: 405 (Method Not Allowed) ์๋ฌ ๋ฐํ
RewriteRule .* - [R=405,L]
</IfModule>
2. WAS ๋ ๋ฒจ ์ฐจ๋จ (web.xml)
์น ์๋ฒ ์ค์ ์ด ๋ถ๊ฐ๋ฅํ๊ฑฐ๋, ์ ํ๋ฆฌ์ผ์ด์ (WAR) ๋จ์๋ก ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ ํ์ค ๋ฐฐํฌ ์์ ์(web.xml)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ค์ ๋ฐฉ๋ฒ
web.xml์ security-constraint๋ฅผ ์ถ๊ฐํ์ฌ ํน์ ๋ฉ์๋์ ๋ํ ์ ๊ทผ์ ์ ํํฉ๋๋ค.
<security-constraint>
<web-resource-collection>
<web-resource-name>Restricted Methods</web-resource-name>
<url-pattern>/*</url-pattern>
<!-- ์ฐจ๋จํ ๋ฉ์๋ ๋ช
์ -->
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>TRACE</http-method>
<http-method>OPTIONS</http-method>
<http-method>HEAD</http-method>
</web-resource-collection>
<!-- ์ค์: auth-constraint๋ฅผ ๋น์๋๋ฉด ๋๊ตฌ์๊ฒ๋ ๊ถํ์ ์ฃผ์ง ์์(์ฐจ๋จ) -->
<auth-constraint />
</security-constraint>
3. ๊ฒ์ฆ (Verification)
์ค์ ์ ์ฉ ํ ๋ฐ๋์ ํ
์คํธ๋ฅผ ํตํด ์ฐจ๋จ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. telnet ๋๋ curl์ ์ฌ์ฉํฉ๋๋ค.
Telnet์ ์ด์ฉํ ํ ์คํธ
$ telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
# OPTIONS ๋ฉ์๋ ์์ฒญ ์
๋ ฅ
OPTIONS / HTTP/1.0
Host: localhost
(์ํฐ ๋ ๋ฒ)
# ๊ฒฐ๊ณผ ํ์ธ (403 Forbidden ๋๋ 405 Method Not Allowed ํ์ธ)
HTTP/1.1 403 Forbidden
Date: Wed, 04 Jul 2018 01:44:40 GMT
...
Curl์ ์ด์ฉํ ํ ์คํธ (๊ฐํธ)
# -X ์ต์
์ผ๋ก ๋ฉ์๋ ์ง์ , -I ์ต์
์ผ๋ก ํค๋๋ง ํ์ธ
curl -v -X OPTIONS http://localhost/
# ๊ฒฐ๊ณผ: < HTTP/1.1 403 Forbidden ํ์ธ
Next Step:
๋ฉ์๋ ์ฐจ๋จ ์ธ์๋ ServerTokens Prod ์ค์ ์ ํตํด ํค๋์ ๋
ธ์ถ๋๋ ์น ์๋ฒ ๋ฒ์ ์ ๋ณด๋ฅผ ์จ๊ธฐ๋ ๋ณด์ ์กฐ์น๋ฅผ ์ถ๊ฐ๋ก ๊ฒํ ํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
