νλ‘ νΈμλ μΉ κ³΅μ λμ 보μ μμ§μ μ¬μΈ΅ λΆμνκ³ , μμ ν μΉ κ³΅μ λ₯Ό μν λ°μ΄ν° λ³΄νΈ μ λ΅κ³Ό λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄λ΄ λλ€.
νλ‘ νΈμλ μΉ κ³΅μ λμ 보μ μμ§: 곡μ λ°μ΄ν° 보νΈ
μΉ κ³΅μ λμ API(Web Share Target API)λ μΉ μ ν리μΌμ΄μ μ΄ μ¬μ©μμ κΈ°κΈ°μ μλ λ€λ₯Έ μ ν리μΌμ΄μ μ΄λ μΉ νμ΄μ§λ‘λΆν° 곡μ λ λ°μ΄ν°λ₯Ό λ°μ μ μκ² ν΄μ£Όλ κ°λ ₯ν λ©μ»€λμ¦μ λλ€. μ΄ κΈ°λ₯μ μνν ν΅ν©κ³Ό ν₯μλ μ¬μ©μ κ²½νμ κ°λ₯νκ² ν©λλ€. νμ§λ§ μ μ ν 보μ μ‘°μΉκ° μλ€λ©΄, μΉ κ³΅μ λμ APIλ μ μμ μΈ κ³΅κ²©μ μ·¨μ½ν μ§μ μ μ΄ λ μ μμ΅λλ€. μ΄ κΈμμλ νλ‘ νΈμλ μΉ κ³΅μ λμ 보μ μμ§μ λν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡νλ©°, μμ νκ³ μ λ’°ν μ μλ μΉ κ³΅μ κΈ°λ₯μ ꡬμΆνκΈ° μν λ°μ΄ν° λ³΄νΈ μ λ΅κ³Ό λͺ¨λ² μ¬λ‘μ μ€μ μ λ‘λλ€.
μΉ κ³΅μ λμ API μ΄ν΄νκΈ°
μΉ κ³΅μ λμ APIλ₯Ό μ¬μ©νλ©΄ μΉ μ ν리μΌμ΄μ μ΄ κ³΅μ μ½ν μΈ μ λμμΌλ‘ μμ μ λ±λ‘ν μ μμ΅λλ€. μ¬μ©μκ° λ€λ₯Έ μ ν리μΌμ΄μ (μ: κ°€λ¬λ¦¬ μ±μ μ¬μ§, λΈλΌμ°μ μ λ§ν¬)μμ κΈ°κΈ°μ κΈ°λ³Έ 곡μ λ©μ»€λμ¦μ μ¬μ©νμ¬ μ½ν μΈ λ₯Ό 곡μ ν λ, λ±λ‘λ μΉ μ ν리μΌμ΄μ μ 곡μ λμμΌλ‘ μ νν μ μμ΅λλ€. κ·Έλ¬λ©΄ μΉ μ ν리μΌμ΄μ μ 곡μ λ λ°μ΄ν°λ₯Ό μμ νκ³ κ·Έμ λ°λΌ μ²λ¦¬ν μ μμ΅λλ€.
μ£Όμ κ΅¬μ± μμ:
- 곡μ λμ λ§€λνμ€νΈ(Share Target Manifest): μΉ μ ν리μΌμ΄μ
μ λ§€λνμ€νΈ νμΌ(
manifest.json
) λ΄μ μ μΈμΌλ‘, μ ν리μΌμ΄μ μ΄ μ²λ¦¬ν μ μλ λ°μ΄ν° μ νκ³Ό λ°μ΄ν°κ° μ μ‘λ URLμ μ§μ ν©λλ€. - 곡μ λ°μ΄ν°(Share Data): ν μ€νΈ, URL, νμΌ λ±μ ν¬ν¨νμ¬ μ€μ λ‘ κ³΅μ λλ λ°μ΄ν°μ λλ€.
- λμ URL(Target URL): μμ λ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ μΉ μ ν리μΌμ΄μ λ΄μ URLμ λλ€. μ΄ URLμ μΌλ°μ μΌλ‘ POST μλν¬μΈνΈμ λλ€.
μμ (λ¨μνλ manifest.json
):
{
"name": "λ΄ μΉ μ±",
"share_target": {
"action": "/share-target",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"url": "url",
"files": [
{
"name": "sharedFiles",
"accept": ["image/*", "video/*"]
}
]
}
}
}
μΉ κ³΅μ λμκ³Ό κ΄λ ¨λ 보μ μν
μΉ κ³΅μ λμ APIλ κ°λ ₯νμ§λ§, κ°λ°μκ° ν΄κ²°ν΄μΌ ν λͺ κ°μ§ μ μ¬μ μΈ λ³΄μ μνμ λ΄ν¬νκ³ μμ΅λλ€:
- κ΅μ°¨ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS): 곡μ λ λ°μ΄ν°κ° μΉ μ ν리μΌμ΄μ λ΄μμ νμλκ±°λ μ¬μ©λκΈ° μ μ μ λλ‘ μ μ (sanitized)λμ§ μμΌλ©΄, μ μ± μ€ν¬λ¦½νΈλ₯Ό μ ν리μΌμ΄μ μ 컨ν μ€νΈμ μ£Όμ νλ λ° μ μ©λ μ μμ΅λλ€. μ΄λ νΉν ν μ€νΈ λ° URL λ°μ΄ν°μμ μ£Όμ μ°λ € μ¬νμ λλ€.
- κ΅μ°¨ μ¬μ΄νΈ μμ² μμ‘°(CSRF): 곡μ λμ μλν¬μΈνΈκ° CSRF 곡격μΌλ‘λΆν° 보νΈλμ§ μμΌλ©΄, 곡격μλ μ¬μ©μλ₯Ό μμ¬ μμ λ λͺ¨λ₯΄κ² μ μ± λ°μ΄ν°λ₯Ό μλν¬μΈνΈμ μ μΆνκ² ν μ μμ΅λλ€.
- μλΉμ€ κ±°λΆ(DoS): μ μμ μΈ νμμκ° λλμ λ°μ΄ν°λ‘ 곡μ λμ μλν¬μΈνΈλ₯Ό λ²λμμΌ μλ²μ κ³ΌλΆνλ₯Ό μΌμΌν€κ³ μ¬μ© λΆλ₯ μνλ‘ λ§λ€ μ μμ΅λλ€. μ΄λ νΉν νμΌ μ λ‘λλ₯Ό μ²λ¦¬ν λ κ΄λ ¨μ΄ μμ΅λλ€.
- λ°μ΄ν° μ£Όμ (Data Injection): 곡격μλ 곡μ λλ νμΌμ μ μ± μ½λλ λ°μ΄ν°λ₯Ό μ£Όμ νμ¬ μλ²λ ν΄λΉ νμΌμ λ€μ΄λ‘λνκ±°λ μνΈ μμ©νλ λ€λ₯Έ μ¬μ©μλ₯Ό μνμ λΉ λ¨λ¦΄ μ μμ΅λλ€.
- κ°μΈμ 보 λ³΄νΈ μ°λ €: APIλ₯Ό ν΅ν΄ 곡μ λ λ―Όκ°ν λ°μ΄ν°κ° μ μ‘ λ° μ μ₯ μ€μ μ λλ‘ λ³΄νΈλμ§ μμΌλ©΄ 무λ¨μΌλ‘ κ°λ‘μ±μ§κ±°λ μ κ·Όλ μ μμ΅λλ€. μ΄λ μμΉ λ°μ΄ν°, κΈμ΅ μ 보 λλ μλ£ κΈ°λ‘κ³Ό κ°μ κ°μΈ μ 보λ₯Ό λ€λ£° λ νΉν μ€μν©λλ€.
νλ‘ νΈμλ μΉ κ³΅μ λμ 보μ μμ§: κ³μΈ΅μ μ κ·Ό λ°©μ
κ²¬κ³ ν νλ‘ νΈμλ μΉ κ³΅μ λμ 보μ μμ§μ APIμ κ΄λ ¨λ λ€μν μνμ ν΄κ²°νκΈ° μν΄ κ³μΈ΅μ μΈ λ³΄μ μ κ·Ό λ°©μμ ꡬνν΄μΌ ν©λλ€. μ΄ μμ§μ λ¨μΌ μννΈμ¨μ΄κ° μλλΌ μμ ν μ΄μμ 보μ₯νκΈ° μν μ λ΅κ³Ό μ½λ ꡬνμ μ§ν©μ λλ€. μ£Όμ κ΅¬μ± μμλ λ€μκ³Ό κ°μ΅λλ€:
1. μ λ ₯ μ ν¨μ± κ²μ¬ λ° μ μ
μ€λͺ : 곡μ λμ μλν¬μΈνΈμμ λ€μ΄μ€λ λͺ¨λ λ°μ΄ν°μ λν μ격ν μ ν¨μ± κ²μ¬μ μ μ κ° κ°μ₯ μ€μν©λλ€. μ¬κΈ°μλ λ°μ΄ν° μ ν, κΈΈμ΄, νμ λ° μ½ν μΈ λ₯Ό μμ κ°κ³Ό λΉκ΅νμ¬ νμΈνλ κ²μ΄ ν¬ν¨λ©λλ€. μ μ¬μ μΌλ‘ μ μμ μΈ λ¬Έμλ μ½λλ₯Ό μ κ±°νκ±°λ μΈμ½λ©νμ¬ λ°μ΄ν°λ₯Ό μ μ ν©λλ€.
ꡬν:
- λ°μ΄ν° μ ν μ ν¨μ± κ²μ¬: μμ λ λ°μ΄ν°κ° μμ λ°μ΄ν° μ ν(μ: λ¬Έμμ΄, μ«μ, νμΌ)κ³Ό μΌμΉνλμ§ νμΈν©λλ€.
- κΈΈμ΄ μ ν¨μ± κ²μ¬: λ²νΌ μ€λ²νλ‘μ°λ κΈ°ν λ©λͺ¨λ¦¬ κ΄λ ¨ λ¬Έμ λ₯Ό λ°©μ§νκΈ° μν΄ λ¬Έμμ΄μ κΈΈμ΄λ₯Ό μ νν©λλ€.
- νμ μ ν¨μ± κ²μ¬: μ κ· ννμμ΄λ λ€λ₯Έ μ ν¨μ± κ²μ¬ κΈ°μ μ μ¬μ©νμ¬ λ°μ΄ν°κ° μμ νμ(μ: μ΄λ©μΌ μ£Όμ, URL)μ μ€μνλμ§ νμΈν©λλ€.
- μ½ν μΈ μ μ : HTML νκ·Έ, JavaScript μ½λ, SQL μ½μ λ¬Έμμ΄κ³Ό κ°μ μ μ¬μ μΌλ‘ μ μμ μΈ λ¬Έμλ₯Ό μΈμ½λ©νκ±°λ μ κ±°ν©λλ€. DOMPurifyμ κ°μ λΌμ΄λΈλ¬λ¦¬λ HTML μ½ν μΈ λ₯Ό μ μ νλ λ° λ§€μ° μ μ©ν μ μμ΅λλ€.
- νμΌ μ ν μ ν¨μ± κ²μ¬: μ ν리μΌμ΄μ μ νμμ λ°λΌ νμ©λλ νμΌ μ νμ μ격νκ² μ ννκ³ νμΌμ MIME μ νκ³Ό νμ₯μλ₯Ό κ²μ¦ν©λλ€. MIME μ ν μ€νΈνμ λ°©μ§νκΈ° μν΄ μλ² μΈ‘ μ ν¨μ± κ²μ¬λ μ¬μ©ν©λλ€.
- νμΌ ν¬κΈ° μ ν: DoS 곡격μ λ°©μ§νκΈ° μν΄ νμΌ ν¬κΈ° μ νμ μ μ©ν©λλ€.
μμ (JavaScript):
function sanitizeInput(data) {
// κΈ°λ³Έμ μΈ HTML μΈμ½λ©
let sanitized = data.replace(//g, ">");
// μ¬κΈ°μ μΆκ°μ μΈ μ μ λ‘μ§μ λν μ μμ΅λλ€ (μ: DOMPurify μ¬μ©)
return sanitized;
}
function validateURL(url) {
try {
new URL(url);
return true;
} catch (_) {
return false;
}
}
// μ¬μ©λ²:
const sharedText = sanitizeInput(receivedData.text);
if (receivedData.url && !validateURL(receivedData.url)) {
console.error("μ ν¨νμ§ μμ URLμ΄ μ 곡λμμ΅λλ€");
// μ€λ₯λ₯Ό μ μ νκ² μ²λ¦¬ν©λλ€ (μ: μ¬μ©μμκ² μ€λ₯ λ©μμ§ νμ)
}
2. κ΅μ°¨ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) λ°©μ§
μ€λͺ : μΆλ ₯μ μΈμ½λ©νκ³ μ½ν μΈ λ³΄μ μ μ± (CSP)μ μ¬μ©νμ¬ XSS 곡격μ λ°©μ§ν©λλ€.
ꡬν:
- μΆλ ₯ μΈμ½λ©: μΉ μ ν리μΌμ΄μ μ 곡μ λ λ°μ΄ν°λ₯Ό νμν λ XSS 곡격μ λ°©μ§νκΈ° μν΄ νμ μ μ νκ² μΈμ½λ©ν©λλ€. μλ₯Ό λ€μ΄, HTML μμμ ν μ€νΈλ₯Ό νμν λλ HTML μΈμ½λ©μ μ¬μ©νκ³ JavaScript μ½λμμ ν μ€νΈλ₯Ό μ¬μ©ν λλ JavaScript μΈμ½λ©μ μ¬μ©ν©λλ€.
- μ½ν μΈ λ³΄μ μ μ± (CSP): μ격ν CSPλ₯Ό ꡬννμ¬ μΉ μ ν리μΌμ΄μ μ΄ λ¦¬μμ€λ₯Ό λ‘λν μ μλ μμ€λ₯Ό μ μ΄ν©λλ€. μ΄λ 곡격μκ° μ ν리μΌμ΄μ μ 컨ν μ€νΈμ μ μ± μ€ν¬λ¦½νΈλ₯Ό μ£Όμ νλ κ²μ λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€. μλ² μΈ‘ μ½λμμ CSP ν€λλ₯Ό ꡬμ±ν©λλ€.
μμ (CSP ν€λ):
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; object-src 'none'; style-src 'self' https://trusted.cdn.com; img-src 'self' data:;
3. κ΅μ°¨ μ¬μ΄νΈ μμ² μμ‘°(CSRF) 보νΈ
μ€λͺ : CSRF ν ν°μ ꡬννκ±°λ SameSite μΏ ν€ μμ±μ μ¬μ©νμ¬ CSRF 곡격μΌλ‘λΆν° 곡μ λμ μλν¬μΈνΈλ₯Ό 보νΈν©λλ€.
ꡬν:
- CSRF ν ν°: κ° μ¬μ©μ μΈμ μ λν΄ κ³ μ ν CSRF ν ν°μ μμ±νκ³ κ³΅μ λμ νΌμ΄λ μμ²μ ν¬ν¨μν΅λλ€. μλ² μΈ‘μμ ν ν°μ νμΈνμ¬ μμ²μ΄ μ λ’°ν μ μλ μμ€μμ λΉλ‘―λμλμ§ νμΈν©λλ€. μ μ ν ꡬνμ 보μ₯νκΈ° μν΄ CSRF ν ν° μμ± λ° κ²μ¦μ μν΄ μ€κ³λ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν©λλ€.
- SameSite μΏ ν€ μμ±:
SameSite
μΏ ν€ μμ±μ μ¬μ©νμ¬ λΈλΌμ°μ κ° κ΅μ°¨ μ¬μ΄νΈ μμ²κ³Ό ν¨κ» μΏ ν€λ₯Ό 보λ΄λ κ²μ λ°©μ§ν©λλ€.SameSite
μμ±μStrict
λλLax
λ‘ μ€μ νμ¬ CSRF 곡격μ μνν©λλ€. κ·Έλ¬λ ν©λ²μ μΈ κ΅μ°¨ μ¬μ΄νΈ μμ²μ λνSameSite=Strict
μ μν₯μ μΈμ§ν΄μΌ ν©λλ€.
μμ (νΌμ CSRF ν ν°):
<form action="/share-target" method="POST">
<input type="hidden" name="csrf_token" value="YOUR_CSRF_TOKEN">
<!-- λ€λ₯Έ νΌ νλ -->
</form>
4. μλ μ ν λ° λ¨μ© λ°©μ§
μ€λͺ : DoS 곡격 λ° κΈ°ν ννμ λ¨μ©μ λ°©μ§νκΈ° μν΄ μλ μ νμ ꡬνν©λλ€.
ꡬν:
- μμ² μ‘°μ (Throttling): μ¬μ©μκ° μ£Όμ΄μ§ μκ° λ΄μ 곡μ λμ μλν¬μΈνΈμ ν μ μλ μμ² μλ₯Ό μ νν©λλ€. μ΄λ 곡격μκ° μλ²μ μμ²μ λ²λμν€λ κ²μ λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
- CAPTCHA: μλνλ λ΄μ΄ 곡μ λμ μλν¬μΈνΈμ λ°μ΄ν°λ₯Ό μ μΆνλ κ²μ λ°©μ§νκΈ° μν΄ CAPTCHAλ₯Ό μ¬μ©ν©λλ€. μ¬μ©μκ° νΌμ¦μ ν νμ μμ΄ νλ λΆμμ μ¬μ©νμ¬ μΈκ°κ³Ό λ΄μ ꡬλ³νλ reCAPTCHA v3μ κ°μ μ΅μ CAPTCHA μ루μ μ μ¬μ©νλ κ²μ κ³ λ €νμμμ€.
- IP μ°¨λ¨: μ μμ μΈ νλκ³Ό κ΄λ ¨λ κ²μΌλ‘ μλ €μ§ IP μ£Όμλ₯Ό μ°¨λ¨ν©λλ€.
μμ (μλ μ ν - μμ¬ μ½λ):
if (isRateLimited(userIP)) {
return error("μμ²μ΄ λ무 λ§μ΅λλ€");
}
recordRequest(userIP);
// 곡μ λμ λ°μ΄ν° μ²λ¦¬
5. νμΌ μ²λ¦¬ 보μ
μ€λͺ : λ°μ΄ν° μ£Όμ λ° κΈ°ν νμΌ κ΄λ ¨ 곡격μ λ°©μ§νκΈ° μν΄ μ격ν νμΌ μ²λ¦¬ 보μ μ‘°μΉλ₯Ό ꡬνν©λλ€.
ꡬν:
- νμΌ μ ν μ ν¨μ± κ²μ¬: νμΌ νμ₯μλΏλ§ μλλΌ MIME μ ν λ° λ΄μ©μ κΈ°λ°μΌλ‘ νμΌ μ νμ κ²μ¦ν©λλ€. λ΄μ©μ κΈ°λ°μΌλ‘ νμΌ μ νμ μ ννκ² κ°μ§ν μ μλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν©λλ€.
- νμΌ ν¬κΈ° μ ν: DoS 곡격μ λ°©μ§νκΈ° μν΄ μ격ν νμΌ ν¬κΈ° μ νμ μ μ©ν©λλ€.
- νμΌ μ€μΊ: λ°μ΄λ¬μ€ λ°±μ μ€μΊλλ₯Ό μ¬μ©νμ¬ μ λ‘λλ νμΌμμ 맬μ¨μ΄ λ° κΈ°ν μ μ± μ½ν μΈ λ₯Ό κ²μ¬ν©λλ€.
- μμ ν μ μ₯μ: μ λ‘λλ νμΌμ μΌλ°μΈμ΄ μ§μ μ κ·Όν μ μλ μμ ν μμΉμ μ μ₯ν©λλ€.
- Content-Disposition ν€λ: νμΌμ μ 곡ν λ
Content-Disposition
ν€λλ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ κ° νμΌμ μ²λ¦¬νλ λ°©λ²μ μ§μ ν©λλ€.Content-Disposition: attachment
λ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ κ° νμΌμ λΈλΌμ°μ μ°½μ νμνλ λμ λ€μ΄λ‘λνλλ‘ κ°μ ν©λλ€. μ΄λ XSS 곡격μ λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
6. λ°μ΄ν° μνΈν λ° κ°μΈμ 보 보νΈ
μ€λͺ : μ μ‘ λ° μ μ₯ μ€ λ―Όκ°ν λ°μ΄ν°λ₯Ό μνΈννμ¬ μ¬μ©μ κ°μΈμ 보λ₯Ό 보νΈν©λλ€.
ꡬν:
- HTTPS: HTTPSλ₯Ό μ¬μ©νμ¬ μΉ μ ν리μΌμ΄μ κ³Ό μλ² κ°μ λͺ¨λ ν΅μ μ μνΈνν©λλ€. μλ²κ° μ ν¨ν SSL/TLS μΈμ¦μλ‘ κ΅¬μ±λμλμ§ νμΈν©λλ€.
- μ μ₯ λ°μ΄ν° μνΈν(Data Encryption at Rest): κ°λ ₯ν μνΈν μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€λ νμΌ μμ€ν μ μ μ₯λ λ―Όκ°ν λ°μ΄ν°λ₯Ό μνΈνν©λλ€. μνΈν ν€λ₯Ό μμ νκ² μ μ₯νκ³ κ΄λ¦¬νκΈ° μν΄ ν€ κ΄λ¦¬ μμ€ν μ¬μ©μ κ³ λ €ν©λλ€.
- λ°μ΄ν° μ΅μν: μΉ μ ν리μΌμ΄μ μ΄ μλνλ λ° μ λμ μΌλ‘ νμν λ°μ΄ν°λ§ μμ§νκ³ μ μ₯ν©λλ€. νμνμ§ μμ λ―Όκ°ν λ°μ΄ν°μ μμ§ λ° μ μ₯μ νΌν©λλ€.
- κ°μΈμ 보 μ²λ¦¬λ°©μΉ¨: ν¬κ΄μ μΈ κ°μΈμ 보 μ²λ¦¬λ°©μΉ¨μ ν΅ν΄ μ¬μ©μμκ² λ°μ΄ν° κ°μΈμ 보 λ³΄νΈ κ΄νμ λͺ ννκ² μ λ¬ν©λλ€. λ°μ΄ν°λ₯Ό μμ§, μ¬μ©, 보νΈνλ λ°©λ²μ λν΄ ν¬λͺ νκ² κ³΅κ°ν©λλ€.
7. 보μ κ°μ¬ λ° μΉ¨ν¬ ν μ€νΈ
μ€λͺ : μ μ¬μ μΈ μ·¨μ½μ μ μλ³νκ³ ν΄κ²°νκΈ° μν΄ μ κΈ°μ μΌλ‘ 보μ κ°μ¬ λ° μΉ¨ν¬ ν μ€νΈλ₯Ό μνν©λλ€.
ꡬν:
- μ½λ 리뷰: μ½λλ² μ΄μ€μμ μ μ¬μ μΈ λ³΄μ κ²°ν¨μ μλ³νκΈ° μν΄ μ κΈ°μ μΈ μ½λ 리뷰λ₯Ό μνν©λλ€.
- 보μ κ°μ¬: μΉ μ ν리μΌμ΄μ μ μ λ°μ μΈ λ³΄μ μνλ₯Ό νκ°νκΈ° μν΄ μ κΈ°μ μΈ λ³΄μ κ°μ¬λ₯Ό μνν©λλ€.
- μΉ¨ν¬ ν μ€νΈ: 곡격μκ° μ μ©ν μ μλ μ·¨μ½μ μ μλ³νκΈ° μν΄ μ 3μ 보μ νμ¬μ μΉ¨ν¬ ν μ€νΈλ₯Ό μλ’°ν©λλ€.
- μ·¨μ½μ μ€μΊ: μλνλ μ·¨μ½μ μ€μΊ λꡬλ₯Ό μ¬μ©νμ¬ μΉ μ ν리μΌμ΄μ μ μ’ μμ±μμ μλ €μ§ μ·¨μ½μ μ μλ³ν©λλ€.
κ΅μ μ κ³ λ €μ¬ν
κΈλ‘λ² μ¬μ©μλ₯Ό μν νλ‘ νΈμλ μΉ κ³΅μ λμ 보μ μμ§μ μ€κ³ν λ λͺ κ°μ§ κ΅μ μ κ³ λ €μ¬νμ΄ μ€μν©λλ€:
- λ°μ΄ν° κ°μΈμ 보 λ³΄νΈ κ·μ : μ λ½μ μΌλ° λ°μ΄ν° λ³΄νΈ κ·μ (GDPR) λ° λ―Έκ΅μ μΊλ¦¬ν¬λμ μλΉμ κ°μΈμ 보 보νΈλ²(CCPA)κ³Ό κ°μ κ΄λ ¨ λ°μ΄ν° κ°μΈμ 보 λ³΄νΈ κ·μ μ μ€μν©λλ€. μ΄λ¬ν κ·μ μ μ¬μ©μ λ°μ΄ν°λ₯Ό μμ§, μ²λ¦¬ λ° μ μ₯νλ λ°©μμ μ€λν μν₯μ λ―ΈμΉ©λλ€.
- νμ§ν(Localization): λ€λ₯Έ μΈμ΄μ λ¬Ένμ κ·λ²μ μ§μνλλ‘ μΉ μ ν리μΌμ΄μ μ νμ§νν©λλ€. μ¬κΈ°μλ μ€λ₯ λ©μμ§ λ²μ, λ μ§ λ° μκ°μ μ¬λ°λ₯Έ νμ νμ, μ μ ν ν΅ν κΈ°νΈ μ¬μ© λ±μ΄ ν¬ν¨λ©λλ€.
- λ¬Έμ μΈμ½λ©: UTF-8κ³Ό κ°μ΄ κ΄λ²μν λ¬Έμλ₯Ό μ§μνλ λ¬Έμ μΈμ½λ©μ μ¬μ©ν©λλ€. μΉ μ ν리μΌμ΄μ μ΄ λ¬Έμ μμ΄ λ€λ₯Έ μΈμ΄μ λ¬Έμλ₯Ό μ²λ¦¬ν μ μλλ‘ λ³΄μ₯ν©λλ€.
- μ κ·Όμ±: μΉ μ½ν μΈ μ κ·Όμ± κ°μ΄λλΌμΈ(WCAG)κ³Ό κ°μ μ κ·Όμ± μ§μΉ¨μ λ°λΌ μ₯μ κ° μλ μ¬μ©μλ μΉ μ ν리μΌμ΄μ μ μ κ·Όν μ μλλ‘ μ€κ³ν©λλ€.
- λ²λ₯ μ€μ: μΉ μ ν리μΌμ΄μ μ΄ μ¬μ©λλ κ΅κ°μ λͺ¨λ κ΄λ ¨ λ²λ₯ λ° κ·μ μ μ€μνλμ§ νμΈν©λλ€. μ¬κΈ°μλ λ°μ΄ν° κ°μΈμ 보 보νΈ, μ§μ μ¬μ°κΆ λ° μ¨λΌμΈ μ½ν μΈ μ κ΄λ ¨λ λ²λ₯ μ΄ ν¬ν¨λ©λλ€.
μμ (GDPR μ€μ):
μΉ μ ν리μΌμ΄μ μ΄ μ λ½ μ°ν© μ¬μ©μμ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ κ²½μ° GDPRμ μ€μν΄μΌ ν©λλ€. μ¬κΈ°μλ λ°μ΄ν° μμ§ μ μ¬μ©μλ‘λΆν° λͺ μμ μΈ λμ μ»κΈ°, μ¬μ©μμκ² μμ μ λ°μ΄ν°μ λν μ κ·Ό κΆν μ 곡, μ¬μ©μκ° μμ μ λ°μ΄ν°λ₯Ό μμ ν μ μλλ‘ νμ©νλ κ²μ΄ ν¬ν¨λ©λλ€.
μμ ν μΉ κ³΅μ λ₯Ό μν λͺ¨λ² μ¬λ‘
λ€μμ μΉ κ³΅μ λμ APIλ₯Ό μ¬μ©νμ¬ μμ ν μΉ κ³΅μ κΈ°λ₯μ ꡬμΆνκΈ° μν λͺ¨λ² μ¬λ‘ μμ½μ λλ€:
- λ°μ΄ν° μμ§ μ΅μν: μ λμ μΌλ‘ νμν λ°μ΄ν°λ§ μμ§νκ³ μ μ₯ν©λλ€.
- λͺ¨λ μ λ ₯ μ ν¨μ± κ²μ¬ λ° μ μ : 곡μ λμ μλν¬μΈνΈμμ μμ λ λͺ¨λ λ°μ΄ν°λ₯Ό μ격νκ² κ²μ¦νκ³ μ μ ν©λλ€.
- XSS 곡격 λ°©μ§: μΆλ ₯μ μΈμ½λ©νκ³ μ½ν μΈ λ³΄μ μ μ± μ μ¬μ©ν©λλ€.
- CSRF 곡격μΌλ‘λΆν° 보νΈ: CSRF ν ν° λλ SameSite μΏ ν€ μμ±μ μ¬μ©ν©λλ€.
- μλ μ ν ꡬν: DoS 곡격 λ° κΈ°ν ννμ λ¨μ©μ λ°©μ§ν©λλ€.
- μμ ν νμΌ μ²λ¦¬: μ격ν νμΌ μ²λ¦¬ 보μ μ‘°μΉλ₯Ό ꡬνν©λλ€.
- λ―Όκ°ν λ°μ΄ν° μνΈν: μ μ‘ λ° μ μ₯ μ€ λ°μ΄ν°λ₯Ό μνΈνν©λλ€.
- μ κΈ°μ μΈ λ³΄μ κ°μ¬ μν: μ μ¬μ μΈ μ·¨μ½μ μ μλ³νκ³ ν΄κ²°ν©λλ€.
- μ΅μ μν μ μ§: μΉ μ ν리μΌμ΄μ κ³Ό κ·Έ μ’ μμ±μ μ΅μ 보μ ν¨μΉλ‘ μ λ°μ΄νΈν©λλ€.
κ²°λ‘
νλ‘ νΈμλ μΉ κ³΅μ λμ 보μ μμ§μ μΉ κ³΅μ λμ APIλ₯Ό μ¬μ©νλ μΉ μ ν리μΌμ΄μ μ 보νΈνλ λ° μ€μν κ΅¬μ± μμμ λλ€. μ λ ₯ μ ν¨μ± κ²μ¬, XSS λ°©μ§, CSRF 보νΈ, μλ μ ν, μμ ν νμΌ μ²λ¦¬ λ° λ°μ΄ν° μνΈνλ₯Ό ν¬ν¨ν κ³μΈ΅μ μΈ λ³΄μ μ κ·Ό λ°©μμ ꡬνν¨μΌλ‘μ¨ κ°λ°μλ μ¬μ©μ λ°μ΄ν°λ₯Ό 보νΈνκ³ μ μμ μΈ κ³΅κ²©μ λ°©μ§νλ μμ νκ³ μ λ’°ν μ μλ μΉ κ³΅μ κΈ°λ₯μ ꡬμΆν μ μμ΅λλ€. 보μ μ‘°μΉλ₯Ό μ κΈ°μ μΌλ‘ κ²ν νκ³ μ λ°μ΄νΈνλ κ²μ μ§ννλ μνμ μμ λκ°κ³ μΉ μ ν리μΌμ΄μ μ μ₯κΈ°μ μΈ λ³΄μμ 보μ₯νλ λ° λ§€μ° μ€μν©λλ€. 보μμ μΌνμ± ν΄κ²°μ± μ΄ μλ μ§μμ μΈ κ³Όμ μμ κΈ°μ΅νμμμ€. νμ 보μ λͺ¨λ² μ¬λ‘λ₯Ό μ°μ μνκ³ μ΅μ 보μ μν λ° μ·¨μ½μ μ λν μ 보λ₯Ό μ μ§νμμμ€.
μ΄λ¬ν μμΉμ λΆμ§λ°ν μ μ©ν¨μΌλ‘μ¨ κ΄λ ¨ 보μ μνμ μννλ©΄μ μΉ κ³΅μ λμ APIμ κ°λ ₯ν κΈ°λ₯μ μμ μκ² νμ©νμ¬ μ μΈκ³ μ¬μ©μμκ² μμ νκ³ μνν 곡μ κ²½νμ 보μ₯ν μ μμ΅λλ€.