λ¬Έμ μν©
- Electron κΈ°λ°μΌλ‘ νλ‘κ·Έλ¨μ΄ κ²°κ³Ό λ°μ΄ν°λ₯Ό Spring μλ²λ‘ μ μ‘νλ κ³Όμ μμ CSRF ν ν°μ μꡬνλ λ¬Έμ μ μ§λ©΄νκ² λ¨
- CSRF ν ν°μ΄ μμ κ²½μ° μλ²μμ μμ²μ μ°¨λ¨νμ¬, μ΄λ‘ μΈν΄ μ μμ μΈ λ°μ΄ν° μ μ‘μ΄ λΆκ°λ₯ν μν©μ΄ λ°μ
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν κ°λ° κ³Όμ κ³Ό λ°©λ² κΈ°λ‘
CSRF(Cross-Site Request Forgery)
κ°λ
- 곡격μ μμ²μ΄ μ¬μ©μμ μμ²μΈ κ²μ²λΌ μμ΄λ 곡격 λ°©μ
- μ¬μ©μκ° νΉμ μ¬μ΄νΈμ λ‘κ·ΈμΈν μνλ‘ μ
μμ μΈ μΉ μ¬μ΄νΈμ λ°©λ¬Ένμ¬ λ‘κ·ΈμΈνμ¬ νΉμ μ¬μ΄νΈμ μ
μ± μμ²μ 보λ΄λλ‘ μ λ
- μ¬μ©μκ° μΈμ¦ν μΈμ
μμ μΉ μ΄ν리μΌμ΄μ
μ΄ μ μμ μΈ μμ²κ³Ό λΉμ μμ μΈ μμ²μ ꡬλΆνμ§ λͺ»νλ μ μ μ
μ©
CSRF 보νΈκ° νμν μ΄μ
-
μ¬μ©μκ° νΉμ μ¬μ΄νΈμ λ‘κ·ΈμΈλμ΄ μμ λ, 곡격μκ° μ
μ± μΉμ¬μ΄νΈμ μ¬μ©μλ₯Ό μ λνκ³ κ·Έ μ¬μ΄νΈμμ ν΄λΉ μ¬μ©μμ κΆνμΌλ‘ λ‘κ·ΈμΈλ μΉ μ ν리μΌμ΄μ
μ μμ²μ λ³΄λΌ μ μλ€.
" μλ₯Ό λ€μ΄, CSRF 곡격μ μ¬μ©μκ° μν μΉμ¬μ΄νΈμ λ‘κ·ΈμΈλμ΄ μμ λ 곡격μκ° μ
μ± μμ²μ λ³΄λ΄ μ¬μ©μμ κ³μ’μμ μκΈμ μ΄μ²΄νλ λ±μ λμμ μ€νν μ μμ."
-
CSRFλ νΉν μ¬μ©μμκ² λ³΄μ΄μ§ μλ μμ²μ ν΅ν΄ μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ, μ¬μ©μκ° μ΄λ¬ν 곡격μ μμμ°¨λ¦¬μ§ λͺ»ν κ°λ₯μ±μ΄ ν¬λ€.
Springμμ CSRF λ³΄νΈ λ°©μ
Spring Securityλ CSRF 곡격μ λ°©μ§νκΈ° μν΄ κΈ°λ³Έμ μΌλ‘ CSRF 보νΈλ₯Ό νμ±ν
λμ λ°©μ
- CSRF ν ν° λ°κΈ
- μ¬μ©μκ° μΉ μ ν리μΌμ΄μ
μ μ κ·Όν λ μλ²λ CSRF ν ν°μ λ°κΈνμ¬ μ¬μ©μμκ² μ λ¬(μλ²κ° μμ±ν μμμ κ°)
- μ΄ ν ν°μ μ¬μ©μκ° μν λ³κ²½ μμ²(POST, PUT, DELETE λ±)μ λ³΄λΌ λλ§λ€ ν¨κ» μ μ‘λμ΄μΌ νλ©°, HTML νΌμ΄λ AJAX μμ²μ ν€λμ ν¬ν¨λ μ μμ
- CSRF ν ν° κ²μ¦
- μλ²λ μμ² μ μ λ¬λ CSRF ν ν°μ΄ μΈμ
μμ κ΄λ¦¬λλ ν ν°κ³Ό μΌμΉνλμ§ νμΈ
- μΌμΉνμ§ μμΌλ©΄ μλ²λ μμ²μ κ±°λΆνκ³ , μ΄λ₯Ό ν΅ν΄ CSRF 곡격μ λ°©μ§ν μ μμ
3. CSRF λ°©μ΄ μ λ΅
Spring Securityμμ μ 곡νλ κΈ°λ³Έμ μΈ CSRF λ³΄νΈ μΈμλ μΆκ°μ μΈ λ°©μ΄ μ λ΅μ μ¬μ© κ°λ₯
- μΏ ν€ SameSite μμ±: CSRF 곡격μ λ°©μ§νλ ν κ°μ§ λ°©λ²μ μΏ ν€μ SameSite μμ±μ μ€μ νμ¬ ν΄λΉ μΏ ν€κ° λμΌν μ¬μ΄νΈμμλ§ μ μ‘λλλ‘ μ ννλ κ²
- CORS(Cross-Origin Resource Sharing) μ€μ : μλ²κ° μΈλΆ λλ©μΈμμ μ¨ μμ²μ νμ©νμ§ μλλ‘ CORS μ μ±
μ κ°λ ₯νκ² μ€μ ν μ μμ.
λ¬Έμ ν΄κ²° κ³Όμ
" Electron μμ μλ²λ‘ λ°μ΄ν° μ μ‘ μ CSRF ν ν° μ μ© "
-> Spring μλ²μ μμ²μ 보λ΄κΈ° μν΄μλ CSRF ν ν°μ ν€λμ ν¬ν¨ν΄μΌ νλλ°, μ΄λ κΈ°μ‘΄μ μΈμ¦ μΏ ν€μ ν¨κ» μ μ‘ν΄λ³΄μ
const headers = {
'Cookie': cookieHeader, // μΈμ¦ μΏ ν€λ₯Ό ν€λμ ν¬ν¨
'Content-Type': 'application/json',
[csrfHeader]: csrfToken // CSRF ν ν°μ ν€λμ ν¬ν¨
};
const response = await axios.post('http://localhost: ~ ', {
status: status,
result: message
}, { headers });
- CSRF ν ν°μ μλ²μμ λ°κΈλ°κ³ , ν΄λΌμ΄μΈνΈλ μ΄λ₯Ό ν€λμ ν¬ν¨νμ¬ μλ²λ‘ μ μ‘.
- CSRF ν€λ μ²λ¦¬ : μλ²λ‘ λ°μ΄ν°λ₯Ό μ μ‘ν λ CSRF ν ν°κ³Ό ν¨κ» μ μ ν CSRF ν€λλ₯Ό μ€μ νμ¬ μμ²μ μ μμ μΌλ‘ μ²λ¦¬
κ²°κ³Ό : CSRF ν ν°μ΄ μ¬λ°λ₯΄κ² μ μ‘λμ΄ μλ²κ° μμ²μ νμ©νκ³ , κ²°κ³Όλ₯Ό μ μμ μΌλ‘ μ²λ¦¬ν μ μμ
CSRF 보νΈλ₯Ό ν¬ν¨ν 보μ κ΄λ ¨ μμ
μμ, μλ²μ ν΄λΌμ΄μΈνΈ κ°μ μΈμ¦ λ° λ³΄μ μ μ°¨μ μ€μμ±μ μκ² λ μ΄μμλ€.
νΉν CSRFμ κ°μ 보μ μνμ λ°©μ§νκΈ° μν΄μλ μλ²μμ λ°κΈλ ν ν°μ μ μ νκ² μ²λ¦¬νκ³ , μ΄λ₯Ό ν΄λΌμ΄μΈνΈμμ μ νν μ μ‘νλ κ²μ΄ νμλ‘ μκ°νκΈ° !