1. CSRF(Cross-Site Request Forgery)가 무엇인가?
“유저의 브라우저를 속여서, 유저가 의도하지 않은 요청을 서버로 보내게 만드는 공격”
예시로 이해해보자
- 사용자가 A사이트(admin.example.com)에 로그인했음
→ 브라우저에는 JSESSIONID 같은 쿠키가 저장됨 - 사용자가 악성 사이트 B를 방문
- 그 사이트가 숨겨진 HTML을 자동 제출함:
<form action="https://admin.example.com/user/delete" method="POST"> <input type="hidden" name="userId" value="100"> </form> <script>document.forms[0].submit();</script>
4. 브라우저는 자동으로 쿠키(JSESSIONID)를 붙여서 A 서버로 요청을 보냄
→ 서버는 "정상 로그인된 사용자"라고 착각하고 요청을 처리함
즉, CSRF는 ‘브라우저가 자동으로 쿠키를 요청에 넣는 동작’을 악용한 공격이다.
2. Spring Security csrf()의 역할
Spring Security는 기본적으로 CSRF를 방어하기 위해 아래 조건을 확인함:
- POST/PUT/PATCH/DELETE 같은 요청이 올 때
- 요청 안에 CSRF Token이 있는지 검사
- 없으면 요청을 차단
즉, CSRF Token 체계를 강제하는 장치.
3. csrf().disable() → false 로 바꿔서 끌 때의 효과
💡 true = CSRF 보호 활성화 (기본값)
- HTML Form 기반 프로젝트에서 필요
- 다음 조건 충족해야 요청 허용됨:
- 요청에 CSRF 토큰 존재
- 토큰이 서버에 저장된 값과 일치
❗ HTML form 에 hidden input으로 _csrf 값을 넣어야 함
❗ REST API 클라이언트(axios, fetch)는 매 요청마다 헤더로 CSRF 토큰을 보내야 함
❗ false = CSRF 보호 비활성화 (csrf().disable() )
- 토큰 검사 없음
- 서버는 POST/PUT/DELETE 요청을 그대로 허용함
- 브라우저 쿠키 기반 인증이면 매우 위험해짐 → CSRF 공격에 취약
4. CSRF를 꺼도 안전한 경우 (핵심 이해 포인트)
🔒 JWT 기반 인증 + Authorization Header 사용
JWT가 쿠키에 들어가지 않고, 매 요청마다 이렇게 보낸다면:
Authorization: Bearer <jwt>
➡️ 브라우저는 자동으로 Authorization 헤더를 넣지 못함
➡️ 공격자가 악성 페이지에서 요청을 보내도 JWT를 실을 수 없음
➡️ CSRF 자체가 성립하지 않음
5. CSRF를 반드시 켜야 하는 경우
세션 기반 로그인(JSESSIONID 사용)
Cookie: JSESSIONID=abc123
이런 형태라면 브라우저는 자동으로 쿠키를 첨부함 → CSRF 성립
→ 반드시 CSRF를 켜야 함
JWT를 쿠키에 저장하는 경우
토큰이 쿠키로 내려온다면:
Cookie: accessToken=eyJhbGciOi...
이 경우도 쿠키는 자동 첨부되므로 CSRF 공격 가능
6. 핵심 요약 (가장 중요한 4줄)
- CSRF는 브라우저가 쿠키를 자동으로 보내는 특성을 악용한 공격이다.
- CSRF true(=보호 ON) → POST/PUT/DELETE 는 반드시 CSRF 토큰 검증 필요.
- CSRF false(=보호 OFF) → 토큰 검사 없이 요청 허용 → 쿠키 기반 인증이면 매우 위험.
- JWT를 쿠키에 저장하지 않고 Authorization 헤더로만 사용한다면 CSRF는 성립하지 않으므로 disable이 안전하다.
'IT기술 > html' 카테고리의 다른 글
| [HTML] 파일 전송 방법 이해 (0) | 2024.02.22 |
|---|---|
| HTTP header Content-Type 정리 (0) | 2024.02.12 |
| API(application programming interface) 가 무엇인가? 알고 사용하자 (0) | 2023.06.30 |
| [css] div정렬 및 겹치기 position:absolute ,position:relative (0) | 2018.10.30 |
| [css] 선택자(Selector) (0) | 2018.10.30 |