kim57uak/search-mcp-server
If you are the rightful owner of search-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
MCP Naver Search Server is a Node.js server implementing the Model Context Protocol (MCP) to provide Naver web search functionality.
naverSearch
Performs a Naver web search and returns results with an option to include or exclude HTML tags.
MCP Search Server (Node.js)
๋ค์ํ ์น ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ชจ๋ธ ์ปจํ
์คํธ ํ๋กํ ์ฝ(MCP)์ ๊ตฌํํ Node.js ์๋ฒ์
๋๋ค. ์ด ํ๋ก์ ํธ๋ @modelcontextprotocol/sdk
๋ฅผ ์ฌ์ฉํ์ฌ MCP ํธํ ๋๊ตฌ๋ฅผ ๋
ธ์ถํฉ๋๋ค.
โจ ์ฃผ์ ๊ธฐ๋ฅ
- ์ ์ฐํ ๊ฒ์ ์์ง ์ง์:
search_engines.json
ํ์ผ์ ํตํด ๋ค์ํ ๊ฒ์ ์์ง ์ค์ ์ ์ง์ํ๋ฉฐ, ํน์ ์์ง ๊ฒ์ ๋ฐ ์ฌ๋ฌ ์์ง ํตํฉ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. - ์ผ๋ฐ ์น ๊ฒ์ ๋๊ตฌ (
search
):- ์ฃผ์ด์ง ๊ฒ์์ด์ ๋ํด ํน์ ๊ฒ์ ์์ง ๋๋ ์ฌ๋ฌ ์์ง์์ ์น ๊ฒ์์ ์ํํฉ๋๋ค.
- ๊ฒ์ ๊ฒฐ๊ณผ์์ HTML ํ๊ทธ๋ฅผ ํฌํจํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
- ์ธ์ด ์ฝ๋๋ฅผ ์ง์ ํ์ฌ ํด๋น ์ธ์ด๋ฅผ ์ง์ํ๋ ์์ง์ ๋์์ผ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.
- ํน์ Google ๊ฒ์ ๋๊ตฌ (
googleSearch
):- CAPTCHA ์ฐํ๋ฅผ ์๋ํ๋
HumanLikeGoogleCrawler
๋ฅผ ์ฌ์ฉํ์ฌ Google ๊ฒ์์ ์ํํฉ๋๋ค.
- CAPTCHA ์ฐํ๋ฅผ ์๋ํ๋
- URL ์ฝํ
์ธ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ฌ์ฉ์ ์ ์ URL ๊ฒ์ (
fetchUrl
):- ์ง์ ๋ URL์ ์น ํ์ด์ง ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- URL๊ณผ ํจ๊ป ๊ฒ์์ด ๋ฐ ๊ฒ์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์ ๊ณตํ์ฌ, ํด๋น URL ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ ์ ์ ๊ฒ์์ ์คํํ ์ ์์ต๋๋ค.
- MCP ํธํ:
@modelcontextprotocol/sdk
๋ฅผ ์ฌ์ฉํ์ฌ MCP ํ์ค์ ๋ฐ๋ฅด๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. - ์ค์ ๊ฐ๋ฅ:
- ๊ฒ์ ์์ง ๊ด๋ จ ์ค์ :
search_engines.json
(์์ง๋ณ URL, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ฑ) - ์๋น์ค ๋ฐ ํฌ๋กค๋ฌ ์ค์ :
src/config/serviceConfig.js
(ํฌ๋กค๋ฌ ํ์ , ์์ธ ์ต์ , Google UI ์ ํ์ ๋ฑ)
- ๊ฒ์ ์์ง ๊ด๋ จ ์ค์ :
- ๊ตฌ์กฐํ๋ ๋ก๊น
:
winston
์ ํ์ฉํ์ฌ ์์ธํ ๋ก๊ทธ๋ฅผ ์ ๊ณตํฉ๋๋ค. - SOLID ์ค๊ณ ์์น: ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ๊ฐ๋ฐ๋์์ต๋๋ค.
โ๏ธ ๋ชจ๋ธ ์ปจํ ์คํธ ํ๋กํ ์ฝ(MCP)์ ๋ํ์ฌ
๋ชจ๋ธ ์ปจํ
์คํธ ํ๋กํ ์ฝ(MCP) SDK (@modelcontextprotocol/sdk
)๋ ์ด ์๋ฒ์ ํต์ฌ ๊ตฌ์ฑ ์์์
๋๋ค. ์ด ์๋ฒ๊ฐ ๋
ธ์ถํ๋ ๋๊ตฌ๋ฅผ ์ ์ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ๋ ์์ํฌ์ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
MCP SDK๋ package.json
ํ์ผ์ ํ๋ก์ ํธ ์ข
์์ฑ์ผ๋ก ๋์ด๋์ด ์์ผ๋ฉฐ, npm install
๋ช
๋ น์ ์คํํ๋ฉด ์๋์ผ๋ก ์ค์น๋ฉ๋๋ค.
๐ ์์ํ๊ธฐ
1. NPX๋ฅผ ์ด์ฉํ ์ง์ ์คํ (๊ถ์ฅ, ์ค์น ๋ถํ์)
์ด ๋๊ตฌ๋ npx
๋ฅผ ์ฌ์ฉํ์ฌ GitHub ์ ์ฅ์์์ ์ง์ ์คํํ ์ ์์ต๋๋ค. ๋ณ๋์ ์ค์น ๊ณผ์ ์ด ํ์ ์์ต๋๋ค.
npx github:kim57uak/search-mcp-server
์ ๋ช ๋ น์ ์คํํ๋ฉด ์๋์ผ๋ก ์ต์ ๋ฒ์ ์ ๋๊ตฌ๋ฅผ GitHub์์ ๋ด๋ ค๋ฐ์ ์คํํฉ๋๋ค. MCP ์๋ฒ๊ฐ ์์๋๊ณ ํ์ค ์ ์ถ๋ ฅ์ ํตํด ํต์ ํ ์ค๋น๊ฐ ๋ฉ๋๋ค.
2. ๋ก์ปฌ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ๋ฅผ ์ํ ์ค์
๋ก์ปฌ ํ๊ฒฝ์์ ๊ฐ๋ฐํ๊ฑฐ๋ ํ ์คํธํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
- ์ ์ฅ์ ๋ณต์ :
git clone https://github.com/kim57uak/search-mcp-server.git cd search-mcp-server
- ์ข
์์ฑ ์ค์น:
npm install
- ์๋ฒ ์คํ:
๋๋ ๊ฐ๋ฐ ๋ชจ๋(nodemon ์ฌ์ฉ):
npm start
npm run dev
์๋ฒ๊ฐ ์์๋๋ฉด ํ์ค ์ ๋ ฅ(stdin)์ ํตํด MCP ์์ฒญ์ ์์ ํ๊ณ ํ์ค ์ถ๋ ฅ(stdout)์ ํตํด ์๋ตํฉ๋๋ค.
search_engines.json
ํ์ผ์ ํตํด ์ฌ์ฉํ ๊ฒ์ ์์ง์ ์ค์ ํ ์ ์์ต๋๋ค.
๐ ๊ฐ๋ฐ์ ๋ฌธ์
๊ฐ๋ฐ, ๊ธฐ์ฌ ๊ฐ์ด๋๋ผ์ธ ๋ฐ ํ๋ก์ ํธ ์ํคํ ์ฒ์ ๋ํ ์์ธํ ์ ๋ณด๋ ****๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๐ ๏ธ ์ฌ์ฉ ๊ฐ๋ฅํ MCP ๋๊ตฌ
1. search
(์ผ๋ฐ ๊ฒ์)
- ์ค๋ช
: ์น ๊ฒ์์ ์ํํฉ๋๋ค.
engineName
์ผ๋ก ํน์ ๊ฒ์ ์์ง์ ์ง์ ํ๊ฑฐ๋,languageCode
๋ฅผ ์ ๊ณตํ์ฌ ํด๋น ์ธ์ด๋ฅผ ์ง์ํ๋ ์ฌ๋ฌ ์์ง์์ ๊ฒ์ํ ์ ์์ต๋๋ค.engineName
์ด ์ง์ ๋์ง ์์ผ๋ฉดlanguageCode
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก (๋๋ ๋ชจ๋ ) ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ๋ฌ ์์ง์์ ํตํฉ ๊ฒ์์ ์๋ํฉ๋๋ค. (search_engines.json
์ ์ ์๋ ์์ง ์ฌ์ฉ) - ์
๋ ฅ (
inputs
):query
(string, ํ์): ๊ฒ์ํ ๋จ์ด๋ ๋ฌธ์ฅ์ ๋๋ค.engineName
(string, ์ ํ): ๊ฒ์์ ์ํํ ํน์ ์์ง์ ์ด๋ฆ์ ๋๋ค (์: "Naver", "Bing".search_engines.json
ํ์ผ ์ฐธ๊ณ ).languageCode
(string, ์ ํ): ๊ฒ์ ๊ฒฐ๊ณผ์ ์ธ์ด๋ฅผ ์ง์ ํ๊ฑฐ๋, ํตํฉ ๊ฒ์ ์ ํด๋น ์ธ์ด๋ฅผ ์ง์ํ๋ ์์ง์ ํํฐ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค (์: "ko", "en").includeHtml
(boolean, ์ ํ, ๊ธฐ๋ณธ๊ฐ:false
):true
๋ก ์ค์ ํ๋ฉด ๊ฒฐ๊ณผ์ HTML ํ๊ทธ๋ฅผ ํฌํจํ๊ณ ,false
์ด๋ฉด ์ ๊ฑฐ๋ ํ ์คํธ๋ง ๋ฐํํฉ๋๋ค.
- ์์ ์ถ๋ ฅ (MCP ์๋ต์
result.content[0].text
๋ด๋ถ JSON ๋ฌธ์์ด):- ํน์ ์์ง ๊ฒ์ ์ (
engineName
์ ๊ณต):{ "query": "๊ฒ์์ด", "engine": "์์ง์ด๋ฆ", "language": "์ธ์ด์ฝ๋", // ์ ๊ณต๋ ๊ฒฝ์ฐ "resultText": "๊ฒ์ ๊ฒฐ๊ณผ ๋ด์ฉ (HTML ํฌํจ ๋๋ ์ ๊ฑฐ๋จ)", "retrievedAt": "YYYY-MM-DDTHH:mm:ss.sssZ", "searchUrl": "์ค์ ์์ฒญ๋๊ฒ์URL" }
- ํตํฉ ๊ฒ์ ์ (
engineName
๋ฏธ์ ๊ณต):[ // ์ฌ๋ฌ ์์ง ๊ฒฐ๊ณผ์ ๋ฐฐ์ด { "query": "๊ฒ์์ด", "searchEngine": "์์ง์ด๋ฆ1", "language": "์ธ์ด์ฝ๋", // ์ ๊ณต๋ ๊ฒฝ์ฐ "resultText": "์์ง1 ๊ฒ์ ๊ฒฐ๊ณผ...", "retrievedAt": "YYYY-MM-DDTHH:mm:ss.sssZ", "searchUrl": "์ค์ ์์ฒญ๋๊ฒ์URL1" }, { "query": "๊ฒ์์ด", "searchEngine": "์์ง์ด๋ฆ2", // ... (์ค๋ฅ ๋ฐ์ ์ error ํ๋ ํฌํจ) "error": "์์ง2 ๊ฒ์ ์คํจ ๋ฉ์์ง", "retrievedAt": "YYYY-MM-DDTHH:mm:ss.sssZ" } ]
- ํน์ ์์ง ๊ฒ์ ์ (
- ํธ์ถ ์์ (Stdio):
- Naver์์ "Node.js" ๊ฒ์:
{ "tool": "search", "inputs": { "query": "Node.js", "engineName": "Naver", "languageCode": "ko", "includeHtml": false }, "id": "readme-generic-naver" }
- ํ๊ตญ์ด๋ฅผ ์ง์ํ๋ ์์ง๋ค์์ "๋ ์จ" ํตํฉ ๊ฒ์:
{ "tool": "search", "inputs": { "query": "๋ ์จ", "languageCode": "ko", "includeHtml": false }, "id": "readme-integrated-ko" }
- Naver์์ "Node.js" ๊ฒ์:
2. googleSearch
(Google ํนํ ๊ฒ์)
- ์ค๋ช
: Google ๊ฒ์์ "์ธ๊ฐ์ฒ๋ผ" ์ํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. CAPTCHA ์ฐํ๋ฅผ ์๋ํ๋ ํน์ ํฌ๋กค๋ฌ(
HumanLikeGoogleCrawler
)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ ์ฃผ๋ก Google ์ค์ ๋ฐ ๊ฒ์์ด์ ์ธ์ด์ ๋ฐ๋ผ ๋ฐํ๋ฉ๋๋ค. - ์
๋ ฅ (
inputs
):query
(string, ํ์): ๊ฒ์ํ ๋จ์ด๋ ๋ฌธ์ฅ์ ๋๋ค.includeHtml
(boolean, ์ ํ, ๊ธฐ๋ณธ๊ฐ:false
): HTML ํ๊ทธ ํฌํจ ์ฌ๋ถ.
- ์์ ์ถ๋ ฅ (MCP ์๋ต์
result.content[0].text
๋ด๋ถ JSON ๋ฌธ์์ด):{ "query": "๊ฒ์์ด", "resultText": "Google ๊ฒ์ ๊ฒฐ๊ณผ ๋ด์ฉ (HTML ํฌํจ ๋๋ ์ ๊ฑฐ๋จ)", "retrievedAt": "YYYY-MM-DDTHH:mm:ss.sssZ", "searchEngine": "google" }
- ํธ์ถ ์์ (Stdio):
{ "tool": "googleSearch", "inputs": { "query": "์ค๋์ ๊ตฌ๊ธ ๊ฒ์", "includeHtml": false }, "id": "readme-example-google" }
3. fetchUrl
(URL ์ฝํ
์ธ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ฌ์ฉ์ ์ ์ URL ๊ฒ์)
- ์ค๋ช
: ์ ๊ณต๋ URL์ ์น ํ์ด์ง ์ฝํ
์ธ ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ ํ์ ์ผ๋ก ๊ฒ์์ด(
query
)์ ๊ฒ์์ด ํ๋ผ๋ฏธํฐ๋ช (queryParamName
)์ ์ ๊ณตํ์ฌ, ํด๋น URL์ ๊ฒ์์ด๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค (์: ํน์ ๊ฒ์ ์์ง์ URL ํ ํ๋ฆฟ์ ๊ฒ์์ด ์ฝ์ ). - ์
๋ ฅ (
inputs
):url
(string, ํ์): ๋ด์ฉ์ ๊ฐ์ ธ์ฌ ์น ํ์ด์ง์ ์ ์ฒด URL ๋๋ ๊ฒ์์ ์ํ ๊ธฐ๋ณธ URL์ ๋๋ค.query
(string, ์ ํ):url
์ ์ถ๊ฐํ ๊ฒ์์ด์ ๋๋ค. ์ด ๊ฐ์ด ์ ๊ณต๋๋ฉด ์ฌ์ฉ์ ์ ์ URL ๊ฒ์์ผ๋ก ๋์ํฉ๋๋ค.queryParamName
(string, ์ ํ, ๊ธฐ๋ณธ๊ฐ:q
):query
๋ฅผ ์ ๋ฌํ URL ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ๋๋ค.includeHtml
(boolean, ์ ํ, ๊ธฐ๋ณธ๊ฐ:false
): ๊ฒฐ๊ณผ์ HTML ํ๊ทธ ํฌํจ ์ฌ๋ถ.
- ์์ ์ถ๋ ฅ (MCP ์๋ต์
result.content[0].text
๋ด๋ถ JSON ๋ฌธ์์ด):{ "url": "์์ฒญ๋ ์ต์ข URL", // query๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ URL "textContent": "์ถ์ถ๋ ํ ์คํธ ๋ด์ฉ...", "retrievedAt": "YYYY-MM-DDTHH:mm:ss.sssZ", "originalUrl": "์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ด๊ธฐ URL", // query ์ฌ์ฉ ์์๋ง ํฌํจ๋ ์ ์์ "queryUsed": "์ฌ์ฉ๋ ๊ฒ์์ด", // query ์ฌ์ฉ ์์๋ง ํฌํจ๋ ์ ์์ "targetUrl": "์ค์ ์์ฒญ๋ ์ต์ข URL" // query ์ฌ์ฉ ์ ๋ณ๊ฒฝ๋ URL๊ณผ ๋์ผ }
- ํธ์ถ ์์ (Stdio):
- ๋จ์ URL ๋ด์ฉ ๊ฐ์ ธ์ค๊ธฐ:
{ "tool": "fetchUrl", "inputs": { "url": "https://developer.mozilla.org/ko/docs/Web/JavaScript", "includeHtml": false }, "id": "readme-fetch-simple" }
- ์ฌ์ฉ์ ์ ์ URL๋ก ๊ฒ์ (DuckDuckGo URL ํ
ํ๋ฆฟ ์ฌ์ฉ):
{ "tool": "fetchUrl", "inputs": { "url": "https://duckduckgo.com/", "query": "Node.js MCP", "queryParamName": "q", "includeHtml": true }, "id": "readme-fetch-custom-search" }
- ๋จ์ URL ๋ด์ฉ ๊ฐ์ ธ์ค๊ธฐ:
๐ฆ ํ๋ก์ ํธ ๊ตฌ์กฐ
mcp-search-server/ โโโ logs/ # ๋ก๊ทธ ํ์ผ (gitignored) โโโ src/ # ์์ค ์ฝ๋ โ โโโ config/ # ์ค์ ํ์ผ (serviceConfig.js) โ โโโ crawlers/ # ํฌ๋กค๋ฌ ๊ตฌํ (humanLikeGoogleCrawler.js ๋ฑ) โ โโโ services/ # ๋น์ฆ๋์ค ๋ก์ง (searchService.js) โ โโโ tools/ # MCP ๋๊ตฌ ์ ์ (genericSearchTool.js, googleSearchTool.js, urlFetcherTool.js, index.js) โ โโโ transports/ # ์ ์ก ๊ณ์ธต ์ค์ (stdioTransport.js) โ โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์ (logger.cjs, htmlParser.js, searchEngineManager.js ๋ฑ) โโโ tests/ # ํ ์คํธ ์ฝ๋ โโโ .gitignore โโโ .prettierrc.json # Prettier ์ค์ โโโ DEVELOPER_MANUAL.ko.md โโโ INSTALL.md โโโ README.md # ํ์ฌ ํ์ผ โโโ eslint.config.mjs # ESLint ์ค์ (flat config) โโโ jest.config.js # Jest ์ค์ โโโ nodemon.json # Nodemon ์ค์ โโโ package.json โโโ package-lock.json โโโ search_engines.json # ๊ฒ์ ์์ง URL ๋ฐ ํ๋ผ๋ฏธํฐ ์ค์
๐ ํฌ๋กค๋ฌ ์์ธ: Google ๊ฒ์ ๋ฐ CAPTCHA ์ฐํ
์ด ํ๋ก์ ํธ์ googleSearch
๋๊ตฌ๋ src/crawlers/humanLikeGoogleCrawler.js
์ ๊ตฌํ๋ ํน์ ํฌ๋กค๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ํฌ๋กค๋ฌ๋ Google์ CAPTCHA ๋ฐ ๋ด ํ์ง ๋ฉ์ปค๋์ฆ์ ์ฐํํ๊ธฐ ์ํด ๋ค์ํ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
Google ๊ฒ์ ํฌ๋กค๋ฌ (HumanLikeGoogleCrawler
)
- Puppeteer ๊ธฐ๋ฐ: ์ค์ Chrome ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ดํ๋ Puppeteer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง์ ์ํธ์์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด JavaScript ์คํ, ์ฌ์ฉ์ ์ ๋ ฅ ์๋ฎฌ๋ ์ด์ ๋ฑ ์ค์ ์ฌ์ฉ์์ ์ ์ฌํ ํ๊ฒฝ์ ๊ตฌ์ฑํฉ๋๋ค.
- Stealth ๊ธฐ๋ฅ:
puppeteer-extra-plugin-stealth
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ Puppeteer๊ฐ ์๋ํ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ํ๋ด๋ ๋ค์ํ ์งํ(์:navigator.webdriver
ํ๋๊ทธ)๋ฅผ ์จ๊น๋๋ค. ๋ํ User-Agent, ๋ธ๋ผ์ฐ์ ํ๋ฌ๊ทธ์ธ ์ ๋ณด, ์ธ์ด ์ค์ ๋ฑ์ ์ค์ ์ฌ์ฉ์์ ์ ์ฌํ๊ฒ ์์ฅํฉ๋๋ค.
CAPTCHA ์ฐํ ๋ฐ ํ์ง ํํผ ์ ๋ต
Google์ ์ ๊ตํ ๋ด ํ์ง ์์คํ ์ ๋์ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฒ๋ค์ด ์ ์ฉ๋์์ต๋๋ค:
- ๋ค์ํ User-Agent ๋๋ค ์ฌ์ฉ: ๋ฏธ๋ฆฌ ์ ์๋ ์ต์ ๋ธ๋ผ์ฐ์ User-Agent ๋ชฉ๋ก์์ ๋ฌด์์๋ก ์ ํํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- Viewport ์ค์ : ์ผ๋ฐ์ ์ธ ๋ฐ์คํฌํฑ ํด์๋(์: 1920x1080)๋ก ๋ธ๋ผ์ฐ์ Viewport๋ฅผ ์ค์ ํ์ฌ ์ผ๊ด์ฑ์ ๋์ ๋๋ค.
- ์ธ๊ฐ๊ณผ ์ ์ฌํ ํ๋ ์๋ฎฌ๋ ์ด์
:
- ๋ง์ฐ์ค ์ปค์์ ์์ฐ์ค๋ฌ์ด ์ด๋ ๋ฐ ํด๋ฆญ ์์น์ ๋ฏธ์ธํ ๋๋ค ๋ณํ.
- ๊ฒ์์ด ์ ๋ ฅ ์ ์ค์ ํ์ดํ๊ณผ ์ ์ฌํ ๋๋ค ๋๋ ์ด ์ ์ฉ.
- ํ์ด์ง ๋ก๋ ํ ๋๋ค ์คํฌ๋กค ๋ฐ ๋ง์ฐ์ค ์ด๋.
- ์์ฒญ ๊ฐ ๋๋ค ๋๋ ์ด: ํ์ด์ง ์ด๋, ํด๋ฆญ, ์ ๋ ฅ ๋ฑ ์ฃผ์ ์์ ์ ํ์ ์์ธก ๋ถ๊ฐ๋ฅํ ๋๋ค ๋๋ ์ด๋ฅผ ์ถ๊ฐํ์ฌ ์๋ํ๋ ํจํด์ ๊นจ๋จ๋ฆฝ๋๋ค.
- CAPTCHA ๊ฐ์ง ์ ์ฌ์๋ ๋ก์ง:
- "๋ก๋ด์ด ์๋๋๋ค", "๋น์ ์ ํธ๋ํฝ" ๋ฑ์ ํค์๋๋ก CAPTCHA ํ์ด์ง๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ๊ฐ์ง ์, ์ต๋ 2ํ๊น์ง ์ฌ์๋๋ฅผ ์ํํฉ๋๋ค. (์ด 3ํ ์๋)
- ์ฌ์๋ ์ฌ์ด์๋ 5~10์ด์ ๋น๊ต์ ๊ธด ๋๋ค ๋๊ธฐ ์๊ฐ์ ๊ฐ์ง๋๋ค.
์ต๊ทผ ๊ฐ์ ์ฌํญ
- Viewport ์ค์ ์ถ๊ฐ: ๋ชจ๋ Google ๊ฒ์ ์ ๋์ผํ Viewport(1920x1080)๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ์ต๋๋ค.
- ๋๋ ์ด ๊ฐํ: ํฌ๋กค๋ง ๊ณผ์ ์ ๋ฐ์ ๋๋ค ๋๋ ์ด ๊ฐ์ ์กฐ์ ํ๊ณ ๋ค์์ฑ์ ๋์์ต๋๋ค.
- ์ฌ์๋ ๋ก์ง ๊ฐ์ : CAPTCHA ๋ฐ์ ์ ์ฌ์๋ ํ์๋ฅผ ๋๋ฆฌ๊ณ , ์ฌ์๋ ๊ฐ ๋๊ธฐ ์๊ฐ์ ์ฆ๊ฐ์์ผฐ์ต๋๋ค.
ํ๊ณ์ ๋ฐ ์ฃผ์์ฌํญ
- ์๋ฒฝํ ์ฐํ๋ ์ด๋ ค์: Google์ ๋ด ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ฏ๋ก, ํ์ฌ ์ ์ฉ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ CAPTCHA๊ฐ ๊ฐํ์ ์ผ๋ก ๋ฐ์ํ๊ฑฐ๋ ํฅํ ๋ค์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
- IP ์ฃผ์ ํํ: ์ฌ์ฉ๋๋ ์๋ฒ์ IP ์ฃผ์๊ฐ ๊ณผ๊ฑฐ์ ์คํธ์ด๋ ์ด๋ทฐ์ง์ ์ฌ์ฉ๋ ์ ์ด ์๋ค๋ฉด CAPTCHA ๋ฐ์ ๋น๋๊ฐ ๋์์ง ์ ์์ต๋๋ค. ๊นจ๋ํ IP๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๊ณผ๋ํ ์์ฒญ: ์งง์ ์๊ฐ์ ๋๋ฌด ๋ง์ ์์ฒญ์ ๋ณด๋ด๋ฉด IP๊ฐ ์ฐจ๋จ๋๊ฑฐ๋ CAPTCHA๊ฐ ๋ ์์ฃผ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ ํ ์์ฒญ ๊ฐ๊ฒฉ์ ์ ์งํด์ผ ํฉ๋๋ค.
์ถ๊ฐ ๊ณ ๋ ค ์ฌํญ (ํฅํ ๊ฐ์ ๋ฐฉํฅ)
- ํ๋ก์ ์๋ฒ ๋๋ IP ๋กํ ์ด์ : ๋ค์ํ IP ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ถ์ฐ์ํค๋ฉด ํ์ง ๊ฐ๋ฅ์ฑ์ ๋ฎ์ถ ์ ์์ต๋๋ค.
- ์์ฒญ ๋น๋ ์ ์ด: ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ ์ ์ญ์ ์ธ ์์ฒญ ๋น๋๋ฅผ ์ ์ดํ์ฌ ํน์ ์๊ฐ ๋์ ๋ณด๋ผ ์ ์๋ ์์ฒญ ์๋ฅผ ์ ํํฉ๋๋ค.
- ํค๋ ๋ฐ ๋ธ๋ผ์ฐ์ ํ๊ฑฐํ๋ฆฐํธ ์ ๊ตํ: User-Agent ์ธ์ HTTP ํค๋(Accept-Language, Accept-Encoding ๋ฑ)์ ๋ธ๋ผ์ฐ์ ํ๊ฑฐํ๋ฆฐํธ ์์๋ค์ ๋์ฑ ์ค์ ์ฌ์ฉ์์ ์ ์ฌํ๊ฒ ์ค์ ํฉ๋๋ค.