sliver__

CSRF(Cross-Site Request Forgery) Attack 본문

Backend/Spring Security

CSRF(Cross-Site Request Forgery) Attack

sliver__ 2025. 1. 26. 17:45
728x90

CSRF Attack?

  • User의 Cookie를 사용하여 정보를 변경하거나 탈취
  • PUT, POST, DELETE Method를 비공개 API로 제공하여 민감한 정보를 얻을 수 있는 경우 공격
    1. 예를 들어, 유저가 A domain에 접속하기 위해 로그인
    2. A 서버는 Cookie값을 유저의 browser에 전달하고, A 서버 내에서 User의 쿠키 값을 저장
    3. 이 후, 유저가 스팸 링크를 타고 들어갔는데 해당 링크는 임베디드 form이 동작하도록 설정되어있고 A domain에 post method를 전송하도록 되어있음
    4. 유저의 브라우저의 쿠기 값이 헤더에 추가되고 post method로 A 서버에 API 호출
    5. 메소드 실행 완료 

CSRF 방어

  • Cookie의 JESSSIONID + CSRF 토큰 조합 사용
  • 프론트 <-> 백 사이에 인증을 위해 CSRF 토큰을 추가하고 Cookie + (Request Header 또는 Payload)에 CSRF token 값을 넣어 인증을 진행한다..
    1. 예를 들어, 유저가 로그인을 한 경우 JESSIONID와 CSRF 토큰을 생성하여 브라우저로 넘긴다.
    2. 이 후, 임베디드 form이 수행되는데 403 에러가 나온다.
    3. 이유는 같은 domain에서는 javascript 코드가 동작하면서 CSRF 값을 가져오는게 가능하다. 하지만 해커입장에서는 다른 domain에서 form method를 수행하고, 이는 다른 domain에서 공격하려는 domain의 CSRF 토큰 값을 읽어올 수 없기 때문이다.

 

csrfToken을 생성하기 위한 handler를 등록하고, csrfTokenRepository의 genereateToken 함수를 사용하여 토큰을 생성한다.

유저가 로그인 작업을 수행 시 csrfToken을 생성한다.

 

 

POST method API를 호출할 때 헤더에 CSRF token이 없으면 403 에러가 발생한다.

헤더에 X-XSRF-TOKEN을 추가하고 다시 수행하면 정상 응답이 오는 것을 확인할 수 있다.

 

 

OPEN API라 CSRF token이 필요없는 경우는?

아래와 같이 ignoringRequestMatchers 함수에 CSRF 인증이 필요없는 API를 추가한다.

728x90

'Backend > Spring Security' 카테고리의 다른 글

[Spring security] Authorization 구현  (0) 2025.01.27
[Spring Security] Authentication VS Authorization  (0) 2025.01.27
CORS (Cross Origin Resource Sharing)  (0) 2025.01.26
Spring security (5)  (0) 2025.01.19
Spring security (4)  (0) 2025.01.18
Comments