κ°λ ₯ν νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬ μμ§μΌλ‘ μΉ μ ν리μΌμ΄μ μ 보νΈνμΈμ. μΈμ¦ λͺ¨λ² μ¬λ‘, μμ ν μ μ₯μ, μΌλ°μ μΈ νλ°νΈμλ 곡격μ λν μν μ λ΅μ μμ보μΈμ.
νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬ 보μ μμ§: μΈμ¦ 보νΈ
μΉ μ ν리μΌμ΄μ μ΄ λ―Όκ°ν μ¬μ©μ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ μ€λλ μ λμ§νΈ νκ²½μμ κ°λ ₯ν νλ°νΈμλ 보μμ κ°μ₯ μ€μν©λλ€. μ΄ λ³΄μμ ν΅μ¬ κ΅¬μ± μμλ μ¬μ©μμ μΈμ¦ λ° μΈκ°λ₯Ό μμ νκ² μ²λ¦¬νλ ν¨κ³Όμ μΈ μ격 μ¦λͺ κ΄λ¦¬μ λλ€. μ μ€κ³λ νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬ 보μ μμ§μ λ€μν 곡격μ λν 첫 λ²μ§Έ λ°©μ΄μ μν μ νμ¬ μ¬μ©μ μ격 μ¦λͺ μ 보νΈνκ³ λ°μ΄ν° 무결μ±μ 보μ₯ν©λλ€.
μν νκ²½μ μ΄ν΄
보μ μμ§μ κΈ°μ μ μΈ‘λ©΄μ μ΄ν΄λ³΄κΈ° μ μ, νλ°νΈμλ μ ν리μΌμ΄μ μ λμμΌλ‘ νλ μΌλ°μ μΈ μνμ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
- μ¬μ΄νΈ κ° μ€ν¬λ¦½ν (XSS): 곡격μκ° λ€λ₯Έ μ¬μ©μκ° λ³΄λ μΉμ¬μ΄νΈμ μ μ± μ€ν¬λ¦½νΈλ₯Ό μ£Όμ ν©λλ€. μ΄λ¬ν μ€ν¬λ¦½νΈλ μΏ ν€λ₯Ό νμΉκ±°λ μ¬μ©μλ₯Ό νΌμ± μ¬μ΄νΈλ‘ 리λλ μ νκ±°λ μΉμ¬μ΄νΈ μ½ν μΈ λ₯Ό μμ ν μ μμ΅λλ€.
- μ¬μ΄νΈ κ° μμ² μμ‘°(CSRF): 곡격μκ° μ¬μ©μλ₯Ό μμ¬ λΉλ°λ²νΈ λ³κ²½μ΄λ ꡬ맀μ κ°μ΄ μλνμ§ μμ μμ μ μννκ² λ§λλλ€.
- μ€κ°μ(MitM) 곡격: 곡격μκ° μ¬μ©μ λΈλΌμ°μ μ μλ² κ°μ ν΅μ μ κ°λ‘μ±μ΄ μ격 μ¦λͺ μ νμΉκ±°λ λ°μ΄ν°λ₯Ό μμ ν μ μμ΅λλ€.
- μ격 μ¦λͺ μ€ν°ν(Credential Stuffing): 곡격μκ° λ€λ₯Έ μ μΆ μ¬κ³ μμ μ»μ μμλ μ¬μ©μ μ΄λ¦κ³Ό λΉλ°λ²νΈ λͺ©λ‘μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ κ³μ μ μ κ·Όν©λλ€.
- λ¬΄μ°¨λ³ λμ 곡격(Brute-Force Attacks): 곡격μκ° κ°λ₯ν λ§μ μ‘°ν©μ μλνμ¬ μ¬μ©μ μ격 μ¦λͺ μ μΆμΈ‘νλ €κ³ μλν©λλ€.
- μΈμ νμ΄μ¬νΉ(Session Hijacking): 곡격μκ° μ¬μ©μμ μΈμ IDλ₯Ό νμΉκ±°λ μΆμΈ‘νμ¬ μ¬μ©μλ₯Ό μ¬μΉνκ³ λ¬΄λ¨ μ κ·Ό κΆνμ μ»μ΅λλ€.
- ν΄λ¦μ¬νΉ(Clickjacking): 곡격μκ° μ¬μ©μλ₯Ό μμ¬ μΈμνλ κ²κ³Ό λ€λ₯Έ κ²μ ν΄λ¦νκ² λ§λ€μ΄ μλνμ§ μμ μμ μ μ λ°νκ±°λ λ―Όκ°ν μ 보λ₯Ό λ ΈμΆμν΅λλ€.
μ΄λ¬ν μνμ μ¬μ©μ μνΈ μμ©μ΄ λ°μνλ νλ°νΈμλμ νΉν μ΄μ μ λ§μΆ° μ ν리μΌμ΄μ μ λͺ¨λ μμ€μμ μ·¨μ½μ μ ν΄κ²°νλ ν¬κ΄μ μΈ λ³΄μ μ κ·Ό λ°©μμ νμμ±μ κ°μ‘°ν©λλ€.
νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬ 보μ μμ§μ μ£Όμ κ΅¬μ± μμ
κ°λ ₯ν νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬ 보μ μμ§μ μΌλ°μ μΌλ‘ μ¬μ©μ μ격 μ¦λͺ μ 보νΈνκ³ μΈμ¦ νλ‘μΈμ€λ₯Ό μμ νκ² νκΈ° μν΄ ν¨κ» μλνλ μ¬λ¬ μ£Όμ κ΅¬μ± μμλ‘ κ΅¬μ±λ©λλ€. μ΄λ¬ν κ΅¬μ± μμλ λ€μκ³Ό κ°μ΅λλ€:
1. μμ ν μ격 μ¦λͺ μ μ₯μ
ν΄λΌμ΄μΈνΈ μΈ‘μμ μ¬μ©μ μ격 μ¦λͺ μ μ μ₯νλ λ°©μμ λ§€μ° μ€μν©λλ€. λΉλ°λ²νΈλ₯Ό μΌλ° ν μ€νΈλ‘ μ μ₯νλ κ²μ μ£Όμ 보μ μνμ λλ€. μμ ν μ μ₯μλ₯Ό μν λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- λ‘컬μ λΉλ°λ²νΈλ₯Ό μ λ μ μ₯νμ§ λ§μΈμ: λ‘컬 μ€ν 리μ§, μΈμ μ€ν λ¦¬μ§ λλ μΏ ν€μ λΉλ°λ²νΈλ₯Ό μ§μ μ μ₯νμ§ λ§μΈμ. μ΄λ¬ν μ μ₯ λ©μ»€λμ¦μ XSS 곡격μ μ·¨μ½ν©λλ€.
- ν ν° κΈ°λ° μΈμ¦ μ¬μ©: λ―Όκ°ν μ 보λ₯Ό λΈλΌμ°μ μ μ§μ μ μ₯νλ κ²μ νΌνκΈ° μν΄ ν ν° κΈ°λ° μΈμ¦(μ: JWT - JSON μΉ ν ν°)μ ꡬννμΈμ. XSS λ° MitM 곡격μ μννκΈ° μν΄ ν ν°μ `HttpOnly` λ° `Secure` μμ±μΌλ‘ νμλ μΏ ν€μ μμ νκ² μ μ₯νμΈμ.
- μμ ν μ μ₯μ μν΄ λΈλΌμ°μ API νμ©: μΈμ¦ ν ν° μΈμ λ―Όκ°ν λ°μ΄ν°(μ: API ν€)μ κ²½μ°, λΈλΌμ°μ μ λ΄μ₯ μνΈν API(Web Crypto API)λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μνΈνν ν λ‘컬 μ€ν 리μ§μ μ μ₯νλ κ²μ κ³ λ €νμΈμ. μ΄λ μΆκ°μ μΈ λ³΄νΈ κ³μΈ΅μ μΆκ°νμ§λ§ μ μ€ν ꡬνμ΄ νμν©λλ€.
μμ: JWT ν ν° μ μ₯
JWTλ₯Ό μ¬μ©ν λ, μλ°μ€ν¬λ¦½νΈκ° μ§μ μ κ·Όνλ κ²μ λ§μ XSS 곡격μ μννκΈ° μν΄ ν ν°μ `HttpOnly` μΏ ν€μ μ μ₯νμΈμ. `Secure` μμ±μ μΏ ν€κ° HTTPSλ₯Ό ν΅ν΄μλ§ μ μ‘λλλ‘ λ³΄μ₯ν©λλ€.
// μΏ ν€μ JWT ν ν° μ€μ
document.cookie = "authToken=YOUR_JWT_TOKEN; HttpOnly; Secure; Path=/";
2. μ λ ₯ μ ν¨μ± κ²μ¬ λ° μ΄κ· (Sanitization)
μ μμ μΈ μ λ ₯μ΄ λ°±μλ μμ€ν μ λλ¬νλ κ²μ λ°©μ§νλ κ²μ΄ νμμ μ λλ€. νλ°νΈμλμμ κ°λ ₯ν μ λ ₯ μ ν¨μ± κ²μ¬ λ° μ΄κ· μ ꡬννμ¬ μ μ¬μ μΌλ‘ μ ν΄ν λ°μ΄ν°λ₯Ό κ±Έλ¬λ΄μΈμ.
- νμ΄νΈλ¦¬μ€νΈ μ λ ₯ μ ν¨μ± κ²μ¬: νμ© κ°λ₯ν μ λ ₯μ μ μνκ³ κ·Έ μ μμ λΆν©νμ§ μλ λͺ¨λ κ²μ κ±°λΆνμΈμ.
- μ¬μ©μ μ λ ₯ μ΄κ· : μ½λλ λ§ν¬μ μΌλ‘ ν΄μλ μ μλ λ¬Έμλ₯Ό μ΄μ€μΌμ΄ννκ±°λ μ κ±°νμΈμ. μλ₯Ό λ€μ΄, `<`, `>`, `&`, `"`λ₯Ό ν΄λΉ HTML μν°ν°λ‘ λ°κΎΈμΈμ.
- λ¬Έλ§₯ μΈμ μ΄κ· : μ λ ₯μ΄ μ¬μ©λ μμΉ(μ: HTML, URL, μλ°μ€ν¬λ¦½νΈ)μ λ°λΌ λ€λ₯Έ μ΄κ· κΈ°μ μ μ μ©νμΈμ.
μμ: HTML μΆλ ₯μ μν μ¬μ©μ μ λ ₯ μ΄κ·
function sanitizeHTML(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML; // HTML μν°ν°λ₯Ό μμ νκ² μΈμ½λ©
}
const userInput = "";
const sanitizedInput = sanitizeHTML(userInput);
document.getElementById('output').innerHTML = sanitizedInput; // <script>alert('XSS')</script> μΆλ ₯
3. μΈμ¦ νλ¦ λ° νλ‘ν μ½
μ¬λ°λ₯Έ μΈμ¦ νλ¦κ³Ό νλ‘ν μ½μ μ ννλ κ²μ 보μμ λ§€μ° μ€μν©λλ€. νλ μ ν리μΌμ΄μ μ μ’ μ’ OAuth 2.0 λ° OpenID Connectμ κ°μ νμ€νλ νλ‘ν μ½μ νμ©ν©λλ€.
- OAuth 2.0: μ 3μ μ ν리μΌμ΄μ μ΄ μ¬μ©μμ μ격 μ¦λͺ μ 곡μ νμ§ μκ³ λ¦¬μμ€ μλ²(μ: Google, Facebook)μ μ¬μ©μ 리μμ€μ μ κ·Όν μ μκ² νλ μΈκ° νλ μμν¬μ λλ€.
- OpenID Connect (OIDC): OAuth 2.0 μμ ꡬμΆλ μΈμ¦ κ³μΈ΅μΌλ‘, μ¬μ©μμ μ μμ νμΈνλ νμ€νλ λ°©λ²μ μ 곡ν©λλ€.
- λΉλ°λ²νΈ μλ μΈμ¦: λΉλ°λ²νΈ κ΄λ ¨ 곡격μ μνμ μ€μ΄κΈ° μν΄ λ§€μ§ λ§ν¬, μ체 μΈμ¦ λλ μΌνμ© λΉλ°λ²νΈ(OTP)μ κ°μ λΉλ°λ²νΈ μλ μΈμ¦ λ°©λ²μ ꡬννλ κ²μ κ³ λ €νμΈμ.
- λ€μ€ μΈμ¦(MFA): λ‘κ·ΈμΈ νλ‘μΈμ€μ μΆκ° 보μ κ³μΈ΅μ μΆκ°νκΈ° μν΄ MFAλ₯Ό ꡬννμ¬ μ¬μ©μκ° μ¬λ¬ μΈμ¦ μμ(μ: λΉλ°λ²νΈ + OTP)λ₯Ό μ 곡νλλ‘ μꡬνμΈμ.
μμ: OAuth 2.0 μμμ νλ¦(μ°Έκ³ : μμμ νλ¦μ 보μ λ¬Έμ λ‘ μΈν΄ μ΅μ μ ν리μΌμ΄μ μμλ μΌλ°μ μΌλ‘ κΆμ₯λμ§ μμΌλ©°, PKCEλ₯Ό μ¬μ©ν μΈμ¦ μ½λ νλ¦μ΄ μ νΈλ©λλ€)
μμμ νλ¦μ λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μμ νν μ¬μ©λμμ΅λλ€. μ ν리μΌμ΄μ μ μ¬μ©μλ₯Ό μΈκ° μλ²λ‘ 리λλ μ ν©λλ€. μΈμ¦ ν, μΈκ° μλ²λ URL νλκ·Έλ¨ΌνΈμ μ‘μΈμ€ ν ν°μ ν¬ν¨νμ¬ μ¬μ©μλ₯Ό μ ν리μΌμ΄μ μΌλ‘ λ€μ 리λλ μ ν©λλ€.
// μ΄κ²μ λ¨μνλ μμμ΄λ©° νλ‘λμ
νκ²½μμ μ¬μ©ν΄μλ μ λ©λλ€.
// λμ PKCEλ₯Ό μ¬μ©ν μΈμ¦ μ½λ νλ¦μ μ¬μ©νμΈμ.
const clientId = 'YOUR_CLIENT_ID';
const redirectUri = encodeURIComponent('https://your-app.com/callback');
const authUrl = `https://authorization-server.com/oauth/authorize?client_id=${clientId}&redirect_uri=${redirectUri}&response_type=token&scope=openid profile email`;
window.location.href = authUrl;
μ€μ: μμμ νλ¦μ 보μμμ νκ³(μ: λΈλΌμ°μ κΈ°λ‘μ ν ν° μ μΆ, ν ν° μ£Όμ μ λν μ·¨μ½μ±)κ° μμ΅λλ€. PKCE(Proof Key for Code Exchange)λ₯Ό μ¬μ©ν μΈμ¦ μ½λ νλ¦μ μ΄λ¬ν μνμ μννλ―λ‘ SPAμ κΆμ₯λλ μ κ·Ό λ°©μμ λλ€.
4. μΈμ κ΄λ¦¬
μ μ ν μΈμ κ΄λ¦¬λ μ¬μ©μ μΈμ¦ μνλ₯Ό μ μ§νκ³ μΈμ νμ΄μ¬νΉμ λ°©μ§νλ λ° λ§€μ° μ€μν©λλ€.
- μμ ν μΈμ ID: κ°λ ₯νκ³ μμΈ‘ λΆκ°λ₯ν μΈμ IDλ₯Ό μμ±νμΈμ.
- HttpOnly λ° Secure μΏ ν€: μΈμ μΏ ν€μ `HttpOnly` λ° `Secure` μμ±μ μ€μ νμ¬ μλ°μ€ν¬λ¦½νΈ μ κ·Όμ λ°©μ§νκ³ κ°κ° HTTPSλ₯Ό ν΅ν μ μ‘μ 보μ₯νμΈμ.
- μΈμ λ§λ£: μμλ μΈμ μ μν₯μ μ ννκΈ° μν΄ μ μ ν μΈμ λ§λ£ μκ°μ ꡬννμΈμ. μ ν΄ μκ° μ΄κ³Ό λ° μ λ μκ° μ΄κ³Όλ₯Ό κ³ λ €νμΈμ.
- μΈμ κ°±μ : μΈμ κ³ μ 곡격μ λ°©μ§νκΈ° μν΄ μ±κ³΅μ μΈ μΈμ¦ ν μΈμ κ°±μ μ ꡬννμΈμ.
- SameSite μμ± μ¬μ© κ³ λ €: CSRF 곡격μ λ°©μ§νκΈ° μν΄ `SameSite` μμ±μ `Strict` λλ `Lax`λ‘ μ€μ νμΈμ.
μμ: μΈμ μΏ ν€ μ€μ
// HttpOnly, Secure, SameSite μμ±μΌλ‘ μΈμ
μΏ ν€ μ€μ
document.cookie = "sessionId=YOUR_SESSION_ID; HttpOnly; Secure; SameSite=Strict; Path=/";
5. XSS 곡격 λ°©μ΄
XSS 곡격μ νλ°νΈμλ μ ν리μΌμ΄μ μ μ£Όμ μνμ λλ€. XSS μνμ μννκΈ° μν΄ λ€μ μ λ΅μ ꡬννμΈμ:
- μ½ν μΈ λ³΄μ μ μ± (CSP): λΈλΌμ°μ κ° λ‘λν μ μλ 리μμ€λ₯Ό μ μ΄νκΈ° μν΄ μ격ν CSPλ₯Ό ꡬννμΈμ. μ΄λ 곡격μκ° μ£Όμ ν μ μ± μ€ν¬λ¦½νΈμ μ€νμ λ°©μ§ν μ μμ΅λλ€.
- μ λ ₯ μ ν¨μ± κ²μ¬ λ° μΆλ ₯ μΈμ½λ©: μμ μΈκΈνλ―μ΄, λͺ¨λ μ¬μ©μ μ λ ₯μ κ²μ¦νκ³ XSS μ·¨μ½μ μ λ°©μ§νκΈ° μν΄ μΆλ ₯μ μ μ νκ² μΈμ½λ©νμΈμ.
- λ΄μ₯ XSS λ³΄νΈ κΈ°λ₯μ΄ μλ νλ μμν¬ μ¬μ©: React, Angular, Vue.jsμ κ°μ μ΅μ νλ°νΈμλ νλ μμν¬λ μ’ μ’ XSS 곡격μ λ°©μ§νλ λ΄μ₯ λ©μ»€λμ¦μ μ 곡ν©λλ€.
μμ: μ½ν μΈ λ³΄μ μ μ± (CSP)
CSPλ λΈλΌμ°μ μ μ΄λ€ μ½ν μΈ μμ€λ₯Ό λ‘λν μ μλμ§ μλ €μ£Όλ HTTP ν€λμ λλ€. μ΄λ λΈλΌμ°μ κ° μ μ± μμ€μμ 리μμ€λ₯Ό λ‘λνλ κ²μ λ°©μ§ν©λλ€.
// μμ CSP ν€λ
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' https://trusted-cdn.com; img-src 'self' data:;
6. CSRF 곡격 λ°©μ΄
CSRF 곡격μ μ¬μ©μλ₯Ό μμ¬ μλνμ§ μμ μμ μ μννκ² ν μ μμ΅λλ€. λ€μ μ‘°μΉλ₯Ό ꡬννμ¬ CSRFλ‘λΆν° 보νΈνμΈμ:
- λκΈ°ν ν ν° ν¨ν΄(STP): κ° μ¬μ©μ μΈμ μ λν΄ κ³ μ νκ³ μμΈ‘ λΆκ°λ₯ν ν ν°μ μμ±νκ³ λͺ¨λ μν λ³κ²½ μμ²μ ν¬ν¨μν€μΈμ. μλ²λ μμ²μ μ²λ¦¬νκΈ° μ μ ν ν°μ νμΈν©λλ€.
- SameSite μΏ ν€ μμ±: μμ μΈκΈνλ―μ΄ `SameSite` μμ±μ `Strict` λλ `Lax`λ‘ μ€μ νλ©΄ CSRF 곡격μ μνμ ν¬κ² μ€μΌ μ μμ΅λλ€.
- μ΄μ€ μ μΆ μΏ ν€ ν¨ν΄: μμμ κ°μΌλ‘ μΏ ν€λ₯Ό μ€μ νκ³ λμΌν κ°μ μμμ μ¨κ²¨μ§ νλλ‘ ν¬ν¨μν€μΈμ. μλ²λ μΏ ν€ κ°κ³Ό μ¨κ²¨μ§ νλ κ°μ΄ μΌμΉνλμ§ νμΈν©λλ€.
μμ: λκΈ°ν ν ν° ν¨ν΄(STP)
- μλ²λ κ° μ¬μ©μ μΈμ μ λν΄ κ³ μ ν CSRF ν ν°μ μμ±νκ³ μλ² μΈ‘μ μ μ₯ν©λλ€.
- μλ²λ HTML μμμ΄λ νλ°νΈμλκ° μ κ·Όν μ μλ μλ°μ€ν¬λ¦½νΈ λ³μμ CSRF ν ν°μ ν¬ν¨μν΅λλ€.
- νλ°νΈμλλ CSRF ν ν°μ μμμ μ¨κ²¨μ§ νλλ AJAX μμ²μ μ¬μ©μ μ§μ ν€λλ‘ ν¬ν¨μν΅λλ€.
- μλ²λ μμ²μ CSRF ν ν°μ΄ μΈμ μ μ μ₯λ CSRF ν ν°κ³Ό μΌμΉνλμ§ νμΈν©λλ€.
// νλ°νΈμλ (μλ°μ€ν¬λ¦½νΈ)
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
fetch('/api/update-profile', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken // CSRF ν ν°μ μ¬μ©μ μ§μ ν€λλ‘ ν¬ν¨
},
body: JSON.stringify({ name: 'New Name' })
});
// λ°±μλ (μμ - μμ¬ μ½λ)
function verifyCSRFToken(request, session) {
const csrfTokenFromRequest = request.headers['X-CSRF-Token'];
const csrfTokenFromSession = session.csrfToken;
if (!csrfTokenFromRequest || !csrfTokenFromSession || csrfTokenFromRequest !== csrfTokenFromSession) {
throw new Error('Invalid CSRF token');
}
}
7. 보μ ν΅μ (HTTPS)
λμ² λ° MitM 곡격μ λ°©μ§νκΈ° μν΄ ν΄λΌμ΄μΈνΈμ μλ² κ°μ λͺ¨λ ν΅μ μ΄ HTTPSλ₯Ό μ¬μ©νμ¬ μνΈνλλλ‘ νμΈμ.
- SSL/TLS μΈμ¦μ νλ: μ λ’°ν μ μλ μΈμ¦ κΈ°κ΄(CA)μμ μ ν¨ν SSL/TLS μΈμ¦μλ₯Ό νλνμΈμ.
- μλ² κ΅¬μ±: μΉ μλ²λ₯Ό ꡬμ±νμ¬ HTTPSλ₯Ό κ°μ νκ³ λͺ¨λ HTTP μμ²μ HTTPSλ‘ λ¦¬λλ μ νμΈμ.
- HSTS (HTTP Strict Transport Security) μ¬μ©: HSTSλ₯Ό ꡬννμ¬ μ¬μ©μκ° μ£Όμμ°½μ `http://`λ₯Ό μ λ ₯νλλΌλ λΈλΌμ°μ κ° νμ HTTPSλ₯Ό ν΅ν΄ μΉμ¬μ΄νΈμ μ μνλλ‘ μ§μνμΈμ.
μμ: HSTS ν€λ
// μμ HSTS ν€λ
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
8. λͺ¨λν°λ§ λ° λ‘κΉ
보μ μ¬κ³ λ₯Ό νμ§νκ³ λμνκΈ° μν΄ ν¬κ΄μ μΈ λͺ¨λν°λ§ λ° λ‘κΉ μ ꡬννμΈμ. λͺ¨λ μΈμ¦ μλ, μΈκ° μ€ν¨ λ° κΈ°ν 보μ κ΄λ ¨ μ΄λ²€νΈλ₯Ό κΈ°λ‘νμΈμ.
- μ€μ μ§μ€μ λ‘κΉ : μ€μ μ§μ€μ λ‘κΉ μμ€ν μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ λͺ¨λ κ΅¬μ± μμμμ λ‘κ·Έλ₯Ό μμ§νμΈμ.
- κ²½κ³ : μ¬λ¬ λ²μ λ‘κ·ΈμΈ μ€ν¨ μλλ λΉμ μμ μΈ μ κ·Ό ν¨ν΄κ³Ό κ°μ μμ¬μ€λ¬μ΄ νλμ μ리λ κ²½κ³ λ₯Ό μ€μ νμΈμ.
- μ κΈ°μ μΈ λ³΄μ κ°μ¬: μ ν리μΌμ΄μ μ μ·¨μ½μ μ μλ³νκ³ ν΄κ²°νκΈ° μν΄ μ κΈ°μ μΈ λ³΄μ κ°μ¬λ₯Ό μννμΈμ.
κ³ κΈ κ³ λ € μ¬ν
1. μ°ν© ID κ΄λ¦¬(FIM)
μ¬λ¬ ID μ 곡μ 체(μ: μμ λ‘κ·ΈμΈ)μ ν΅ν©ν΄μΌ νλ μ ν리μΌμ΄μ μ κ²½μ° μ°ν© ID κ΄λ¦¬(FIM) μμ€ν μ¬μ©μ κ³ λ €νμΈμ. FIMμ μ¬μ©μκ° μ λ’°ν μ μλ ID μ 곡μ 체μ κΈ°μ‘΄ μ격 μ¦λͺ μ μ¬μ©νμ¬ μΈμ¦ν μ μλλ‘ νμ¬ λ‘κ·ΈμΈ νλ‘μΈμ€λ₯Ό λ¨μννκ³ λ³΄μμ ν₯μμν΅λλ€.
2. μΉ μΈμ¦(WebAuthn)
WebAuthnμ νλμ¨μ΄ 보μ ν€(μ: YubiKey) λλ νλ«νΌ μΈμ¦μ(μ: μ§λ¬Έ μΌμ, μΌκ΅΄ μΈμ)λ₯Ό μ¬μ©νμ¬ κ°λ ₯νκ³ λΉλ°λ²νΈ μλ μΈμ¦μ κ°λ₯νκ² νλ μ΅μ μΉ νμ€μ λλ€. WebAuthnμ κΈ°μ‘΄ λΉλ°λ²νΈμ λΉν΄ λ μμ νκ³ μ¬μ©μ μΉνμ μΈ μΈμ¦ κ²½νμ μ 곡ν©λλ€.
3. μν κΈ°λ° μΈμ¦
νΉμ λ‘κ·ΈμΈ μλμ κ΄λ ¨λ μνμ λ°λΌ 보μ μμ€μ λμ μΌλ‘ μ‘°μ νκΈ° μν΄ μν κΈ°λ° μΈμ¦μ ꡬννμΈμ. μλ₯Ό λ€μ΄, μ¬μ©μκ° μλ‘μ΄ μμΉλ μ₯μΉμμ λ‘κ·ΈμΈνλ κ²½μ° μΆκ° μΈμ¦ λ¨κ³(μ: MFA)λ₯Ό μλ£νλλ‘ μꡬν μ μμ΅λλ€.
4. λΈλΌμ°μ 보μ ν€λ
μ ν리μΌμ΄μ μ 보μμ κ°ννκΈ° μν΄ λΈλΌμ°μ 보μ ν€λλ₯Ό νμ©νμΈμ. μ΄λ¬ν ν€λλ XSS, ν΄λ¦μ¬νΉ, MitM 곡격 λ± λ€μν 곡격μ λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
- X-Frame-Options: μΉμ¬μ΄νΈκ° νλ μμ ν¬ν¨λ μ μλμ§ μ¬λΆλ₯Ό μ μ΄νμ¬ ν΄λ¦μ¬νΉ 곡격μ λ°©μ§ν©λλ€.
- X-Content-Type-Options: XSS 곡격μΌλ‘ μ΄μ΄μ§ μ μλ MIME μ€λνμ λ°©μ§ν©λλ€.
- Referrer-Policy: μμ²κ³Ό ν¨κ» μ μ‘λλ 리νΌλ¬ μ 보μ μμ μ μ΄ν©λλ€.
- Permissions-Policy: μΉμ¬μ΄νΈμμ μ¬μ©ν μ μλ λΈλΌμ°μ κΈ°λ₯μ μ μ΄ν μ μμ΅λλ€.
ꡬν μ κ³ λ € μ¬ν
νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬ 보μ μμ§μ ꡬννλ €λ©΄ μ μ€ν κ³νκ³Ό μ€νμ΄ νμν©λλ€. λ€μμ λͺ κ°μ§ μ£Όμ κ³ λ € μ¬νμ λλ€:
- μ¬λ°λ₯Έ κΈ°μ μ ν: μ ν리μΌμ΄μ μ μꡬ μ¬νκ³Ό 보μ μꡬ μ¬νμ μ ν©ν κΈ°μ κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό μ ννμΈμ. ꡬν νλ‘μΈμ€λ₯Ό λ¨μννκΈ° μν΄ ννμ΄ μ’μ μΈμ¦ λΌμ΄λΈλ¬λ¦¬λ νλ μμν¬λ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
- 보μ λͺ¨λ² μ¬λ‘ μ€μ: κ°λ° κ³Όμ μ λ°μ κ±Έμ³ λ³΄μ λͺ¨λ² μ¬λ‘λ₯Ό μ€μνμΈμ. μ κΈ°μ μΌλ‘ μ½λμ μ·¨μ½μ μ κ²ν νκ³ λ³΄μ ν μ€νΈλ₯Ό μννμΈμ.
- μ΅μ μν μ μ§: μ΅μ 보μ ν¨μΉλ₯Ό μ μ©ν μ μλλ‘ μμ‘΄μ±μ μ΅μ μνλ‘ μ μ§νμΈμ. 보μ κΆκ³ λ₯Ό ꡬλ νκ³ μλ‘μ΄ μ·¨μ½μ μ λͺ¨λν°λ§νμΈμ.
- ν κ΅μ‘: κ°λ°νμκ² λ³΄μ λͺ¨λ² μ¬λ‘μ μμ ν μ½λ©μ μ€μμ±μ λν΄ κ΅μ‘νμΈμ. μλ‘μ΄ μνκ³Ό μ·¨μ½μ μ λν μ 보λ₯Ό κ³μ μ νλλ‘ κ²©λ €νμΈμ.
- μ κΈ°μ μΈ κ°μ¬ λ° ν μ€νΈ: μ ν리μΌμ΄μ μ μ·¨μ½μ μ μλ³νκ³ ν΄κ²°νκΈ° μν΄ μ κΈ°μ μΈ λ³΄μ κ°μ¬ λ° μΉ¨ν¬ ν μ€νΈλ₯Ό μννμΈμ.
- μ¬μ©μ κ΅μ‘: μ¬μ©μμκ² κ°λ ₯ν λΉλ°λ²νΈ μ¬μ© λ° νΌμ± μ¬κΈ° λ°©μ§μ κ°μ μμ ν μ¨λΌμΈ κ΄νμ λν΄ κ΅μ‘νμΈμ.
μΈμ¦μ λν κΈλ‘λ² κ³ λ € μ¬ν
κΈλ‘λ² μ¬μ©μλ₯Ό μν μΈμ¦ μμ€ν μ ꡬμΆν λ λ€μ μμλ₯Ό κ³ λ €νμΈμ:
- μΈμ΄ μ§μ: μΈμ¦ νλ¦κ³Ό μ€λ₯ λ©μμ§κ° λ€λ₯Έ μΈμ΄λ‘ νμ§νλμλμ§ νμΈνμΈμ.
- λ¬Ένμ λ―Όκ°μ±: λΉλ°λ²νΈ μꡬ μ¬ν λ° μΈμ¦ μ νΈλμ λ¬Ένμ μ°¨μ΄λ₯Ό μΌλμ λμΈμ.
- λ°μ΄ν° κ°μΈμ 보 λ³΄νΈ κ·μ : μ¬μ©μκ° μμΉν μ§μμ GDPR(μ λ½), CCPA(μΊλ¦¬ν¬λμ) λ° κΈ°ν κ΄λ ¨ λ²λ₯ κ³Ό κ°μ λ°μ΄ν° κ°μΈμ 보 λ³΄νΈ κ·μ μ μ€μνμΈμ.
- μκ°λ: μΈμ λ§λ£ λ° μ κΈ μ μ± μ κ΄λ¦¬ν λ λ€λ₯Έ μκ°λλ₯Ό κ³ λ €νμΈμ.
- μ κ·Όμ±: μ₯μ κ° μλ μ¬μ©μλ μΈμ¦ νλ¦μ μ κ·Όν μ μλλ‘ λ§λμΈμ.
μμ: κΈλ‘λ² μ¬μ©μλ₯Ό μν λΉλ°λ²νΈ μꡬ μ¬ν μ‘°μ
μΌλΆ λ¬ΈνκΆμμλ μ¬μ©μκ° λ³΅μ‘ν λΉλ°λ²νΈ μꡬ μ¬νμ μ΅μνμ§ μμ μ μμ΅λλ€. λΉλ°λ²νΈ μ μ± μ 보μκ³Ό μ¬μ©μ±μ κ· νμ λ§μΆλλ‘ μ‘°μ νκ³ , λΉλ°λ²νΈ 볡ꡬλ₯Ό μν λͺ νν μ§μΉ¨κ³Ό μ΅μ μ μ 곡νμΈμ.
κ²°λ‘
νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬λ₯Ό 보νΈνλ κ²μ νλ μΉ μ ν리μΌμ΄μ 보μμ μ€μν μΈ‘λ©΄μ λλ€. κ°λ ₯ν νλ°νΈμλ μ격 μ¦λͺ κ΄λ¦¬ 보μ μμ§μ ꡬνν¨μΌλ‘μ¨ μ¬μ©μ μ격 μ¦λͺ μ 보νΈνκ³ λ€μν 곡격μ λ°©μ§νλ©° μ ν리μΌμ΄μ μ 무결μ±μ 보μ₯ν μ μμ΅λλ€. 보μμ μ§ννλ μν νκ²½μ λν μ§μμ μΈ λͺ¨λν°λ§, ν μ€νΈ λ° μ μμ΄ νμν μ§μμ μΈ νλ‘μΈμ€μμ κΈ°μ΅νμΈμ. μ΄ κ°μ΄λμμ μ€λͺ ν μμΉμ μμ©νλ©΄ μ ν리μΌμ΄μ μ 보μ νμΈλ₯Ό ν¬κ² ν₯μμν€κ³ μ¬μ©μλ₯Ό μνμΌλ‘λΆν° 보νΈν μ μμ΅λλ€.