πŸ€” CSRFκ°€ ν•„μš”ν•œ μ΄μœ κ°€ 뭘까?

youngΒ·2024λ…„ 8μ›” 25일
0

Spring Security

λͺ©λ‘ 보기
6/7

문제 상황

  • Electron 기반으둜 ν”„λ‘œκ·Έλž¨μ΄ κ²°κ³Ό 데이터λ₯Ό Spring μ„œλ²„λ‘œ μ „μ†‘ν•˜λŠ” κ³Όμ •μ—μ„œ CSRF 토큰을 μš”κ΅¬ν•˜λŠ” λ¬Έμ œμ— μ§λ©΄ν•˜κ²Œ 됨
  • CSRF 토큰이 없을 경우 μ„œλ²„μ—μ„œ μš”μ²­μ„ μ°¨λ‹¨ν•˜μ—¬, 이둜 인해 정상적인 데이터 전솑이 λΆˆκ°€λŠ₯ν•œ 상황이 λ°œμƒ

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 개발 κ³Όμ •κ³Ό 방법 기둝

CSRF(Cross-Site Request Forgery)

κ°œλ…

  • 곡격자 μš”μ²­μ΄ μ‚¬μš©μžμ˜ μš”μ²­μΈ κ²ƒμ²˜λŸΌ μ†μ΄λŠ” 곡격 방식
  • μ‚¬μš©μžκ°€ νŠΉμ • μ‚¬μ΄νŠΈμ— λ‘œκ·ΈμΈν•œ μƒνƒœλ‘œ μ•…μ˜μ μΈ μ›Ή μ‚¬μ΄νŠΈμ— λ°©λ¬Έν•˜μ—¬ λ‘œκ·ΈμΈν•˜μ—¬ νŠΉμ • μ‚¬μ΄νŠΈμ— μ•…μ„± μš”μ²­μ„ 보내도둝 μœ λ„
  • μ‚¬μš©μžκ°€ μΈμ¦ν•œ μ„Έμ…˜μ—μ„œ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 정상적인 μš”μ²­κ³Ό 비정상적인 μš”μ²­μ„ κ΅¬λΆ„ν•˜μ§€ λͺ»ν•˜λŠ” 점을 μ•…μš©

CSRF λ³΄ν˜Έκ°€ ν•„μš”ν•œ 이유

  • μ‚¬μš©μžκ°€ νŠΉμ • μ‚¬μ΄νŠΈμ— λ‘œκ·ΈμΈλ˜μ–΄ μžˆμ„ λ•Œ, κ³΅κ²©μžκ°€ μ•…μ„± μ›Ήμ‚¬μ΄νŠΈμ— μ‚¬μš©μžλ₯Ό μœ λ„ν•˜κ³  κ·Έ μ‚¬μ΄νŠΈμ—μ„œ ν•΄λ‹Ή μ‚¬μš©μžμ˜ κΆŒν•œμœΌλ‘œ 둜그인된 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μš”μ²­μ„ 보낼 수 μžˆλ‹€.
    " 예λ₯Ό λ“€μ–΄, CSRF 곡격은 μ‚¬μš©μžκ°€ 은행 μ›Ήμ‚¬μ΄νŠΈμ— λ‘œκ·ΈμΈλ˜μ–΄ μžˆμ„ λ•Œ κ³΅κ²©μžκ°€ μ•…μ„± μš”μ²­μ„ 보내 μ‚¬μš©μžμ˜ κ³„μ’Œμ—μ„œ μžκΈˆμ„ μ΄μ²΄ν•˜λŠ” λ“±μ˜ λ™μž‘μ„ μ‹€ν–‰ν•  수 있음."

  • CSRFλŠ” 특히 μ‚¬μš©μžμ—κ²Œ 보이지 μ•ŠλŠ” μš”μ²­μ„ 톡해 이루어지기 λ•Œλ¬Έμ—, μ‚¬μš©μžκ°€ μ΄λŸ¬ν•œ 곡격을 μ•Œμ•„μ°¨λ¦¬μ§€ λͺ»ν•  κ°€λŠ₯성이 크닀.

Springμ—μ„œ CSRF 보호 방식

Spring SecurityλŠ” CSRF 곡격을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ 기본적으둜 CSRF 보호λ₯Ό ν™œμ„±ν™”

λ™μž‘ 방식

  1. CSRF 토큰 λ°œκΈ‰
  • μ‚¬μš©μžκ°€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ ‘κ·Όν•  λ•Œ μ„œλ²„λŠ” CSRF 토큰을 λ°œκΈ‰ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 전달(μ„œλ²„κ°€ μƒμ„±ν•œ μž„μ˜μ˜ κ°’)
  • 이 토큰은 μ‚¬μš©μžκ°€ μƒνƒœ λ³€κ²½ μš”μ²­(POST, PUT, DELETE λ“±)을 보낼 λ•Œλ§ˆλ‹€ ν•¨κ»˜ μ „μ†‘λ˜μ–΄μ•Ό ν•˜λ©°, HTML νΌμ΄λ‚˜ AJAX μš”μ²­μ˜ 헀더에 포함될 수 있음
  1. CSRF 토큰 검증
  • μ„œλ²„λŠ” μš”μ²­ μ‹œ μ „λ‹¬λœ CSRF 토큰이 μ„Έμ…˜μ—μ„œ κ΄€λ¦¬λ˜λŠ” 토큰과 μΌμΉ˜ν•˜λŠ”μ§€ 확인
  • μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ„œλ²„λŠ” μš”μ²­μ„ κ±°λΆ€ν•˜κ³ , 이λ₯Ό 톡해 CSRF 곡격을 방지할 수 있음

3. CSRF λ°©μ–΄ μ „λž΅

Spring Securityμ—μ„œ μ œκ³΅ν•˜λŠ” 기본적인 CSRF 보호 외에도 좔가적인 λ°©μ–΄ μ „λž΅μ„ μ‚¬μš© κ°€λŠ₯

  1. μΏ ν‚€ SameSite 속성: CSRF 곡격을 λ°©μ§€ν•˜λŠ” ν•œ 가지 방법은 쿠킀에 SameSite 속성을 μ„€μ •ν•˜μ—¬ ν•΄λ‹Ή μΏ ν‚€κ°€ λ™μΌν•œ μ‚¬μ΄νŠΈμ—μ„œλ§Œ μ „μ†‘λ˜λ„λ‘ μ œν•œν•˜λŠ” 것
  2. 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와 같은 λ³΄μ•ˆ μœ„ν˜‘μ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„œλ²„μ—μ„œ λ°œκΈ‰λœ 토큰을 μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•˜κ³ , 이λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ •ν™•νžˆ μ „μ†‘ν•˜λŠ” 것이 ν•„μˆ˜λ‘œ μƒκ°ν•˜κΈ° !

profile
ΰΈ…Κ•β€’Ν‘Μ«β€’Κ”ΰΈ…

0개의 λŒ“κΈ€