[Spring Security] CSRF

우잼·2023년 9월 18일
2
post-thumbnail

1. 들어가며


Spring 으로 로그인을 구현하다보니 반드시 Spring Security에 대해서 공부가 필요하게 되었고 Security에 대해서 정리가 필요하여 작성하게 되었다.

Spring Security의 여러개의 예제 코드를 보면 http.csrf().dsiable() 이라는게 있었는데 csrf가 무엇이며, 왜 disable 하는 것 일까?

또한 cors를 설정해주는데 설정하는 이유가 무엇이며, cors가 무엇일까?

2. CSRF


2.1. CSRF란?

  • Cross site Request forgery의 줄임말로 사이트간 위조 요청으로 웹 사이트 취약점 공격중 하나
  • 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(CRUD)를 특정 웹사이트에 요청하게 되는 공격
  • CSRF protetion은 spring security에서 default로 설정되며, csrf 토큰을 통해 위조 요청을 방지하게 됨
  1. 특정 웹사이트에 접근하면 특정 토큰을 클라이언트에게 발급함과 동시에 서버 세션 안에 넣는더.
    • A 클라이언트에 대해 A 토큰을, B클라이언트에 대해 B 토큰을 이렇게 각각 발급
  2. 클라이언트는 모든 API를 호출할 때 필수적으로 이 토큰 값을 헤더에 넣어 보냄
  3. 서버에서는 요청을 수행하기전 Filter 레벨에서 세션 안에 들어있는 토큰 값과 요청 토큰 값을 비교
  4. 토큰 값이 불일치할 경우 비정상적인 요청으로 판단하고 Access Denied

그렇다면 이렇게 보안 수준을 향상시키는 CSRF를 왜 disable 것일까??

2.2. Rest api 에서의 CSRF


CSRF-protection

  • Spring security documentation에 따르면 non-browser client 만을 위한 서비스라면 csrf를 disable 하여도 좋다고 함

  • non-browser client란 REST API를 이용한 서버라는 의미이며, Session 기반 인증과는 다르게 stateless하기 때문에 서버에 인증정보를 보관하지 않음

  • 즉, session을 저장하지 않기 때문에 매번 api 요청으로부터 csrf 토큰을 받지 않아도 되기 때문에 disavle() 하는 것이 좋은 판단으로 보임

3. Spring Boot 3.1 Security


3.1. 기존 코드

http.csrf().disable()

3.2. 변경 코드

http.csrf(AbstractHttpConfigurer::disable)

4. Reference


https://velog.io/@letsdev/Spring-Boot-3.1Spring-6.1-Security-Config-csrf-is-deprecated-and-marked-for-removal

https://velog.io/@woohobi/Spring-security-csrf%EB%9E%80

https://tlatmsrud.tistory.com/77

profile
나는 재민

0개의 댓글

관련 채용 정보