CSRF 공격
우선 CSRF 의 의미가 무엇인가 부터 알아보자
웹 어플리케이션의 취약점 중 하나로 인터넷 사용자가 자신의 의지롸는 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 만드는 공격인것이다.
세션을 이용해서 Security를 다룬다면 꼭 조심해야할 공격 기법이며 공격을 하는 과정은 다음과 같다
좀 더 설명을 해보자면
- 어느 한 선량한 사용자가 어떠한 쇼핑몰(서비스)에 접근하여 로그인을 했다. 그렇다면 스프링에서는 세션을 생성하여 쿠키로 발급한다.
- 그렇다면 사용자의 웹에는 세션이 쿠키에 저장이 되는데 사용자는 모든 요청에 쿠키값을 같이 동봉하여 보낸다. 여기서 문제가 생기는것이다. 공격자가 쇼핑몰에 있는 사용자의 정보를 가져오기 위해 즉, 공격을 위해 어떠한 태그를 만들어 사용자에게 보내는것이다.
- 그럼 사용자는 로또 당첨이라는 태그를 누르면서 쇼핑몰에 어떠한 요청을 하게 되고 그 요청엔 물론 세션정보가 들어있다. 그럼 쇼핑몰은 세션을 확인해서 요청한 정보를 모두 열어주게 되고 공격자는 그 모든 정보를 고스란히 가져오게 되는것이다..
CSRF 는 해킹과 바이러스같은 공격은 아니다 CSRF 공격이 성립되려면 2가지가 만족되어야 한다
- 위조 요청을 전송하는 서비스에 피해자는 로그인이 되어있어야 한다.
- 피해자가 공격자가 만든 피싱 사이트에 접속해야 한다.
굉장히 불편하고 까다로워 보이지만 생각보다 어려운 조건은 아니다. 우리는 흥미로운 소재나 자극적인 소재가 있다면 눌러보는 성격을 가진 인간이고 우리는 대중적인 프로그램(네이버, 카카오 등)은 로그인을 해 둔 상황이 굉장히 많기 때문이다.
그래서 시큐리티는 csrf 를 방지하는 역할이 존재한다.
시큐리티는 기본적으로 csrf 를 입력해놓은 상태로 정보를 전달하는데 무작위로 만들어진 긴 암호라고 생각하면 편하다 이는 세션처럼 웹에 따로 저장되지 않으며 그것은 곧 공격자가 탈취할수 있는 방법이 없다는 것이다. 하지만 서버 내에선 저장을 해두고 해당 값이 일치하는지 확인한다.
※ 그렇다면 클라이언트 쪽에선 어떻게 서버에서 보내준 CSRF를 저장하는것일까?
CSRF Filter
- 모든 요청에 랜덤하게 생성된 토큰을 HTTP 파라미터로 요구한다
- 요청 시 전달되는 토큰 값과 서버에 저장된 실제 값과 비교한 후에 만약 일치하지 않으면 요청은 실패한다.
위에서 말했던 csrf값은 저장하는것이 아닌 input 값으로 넣는 것이다. 여기서 중요한것은 input 타입이 hidden이라는것이 매우 중요하다. 즉, csrf값은 서버가 생성해서 가져오는것이고 프론트는 헤더에 실려서 오는 token값을 헤더에서 불러와 다른 요청에 붙여서 사용하게 되는것이다.
정리
내가 처음 시큐리티를 접했을때 csrf를 disable 하는 이유가 가장 궁금했다. 공격을 방지하는 csrf를 왜 굳이 끄는거지? 했었다. 이유는 만든 시큐리티의 인증과 인가 방식이 JWT 로써 이미 토큰값을 통해 전달하고 있기 때문이였다. 덕분에 csrf의 공격에서 안전할 수 있는것이다.
하지만 기초로 돌아와 MVC 기본 패턴 그대로 세션과 쿠키를 사용하는것을 예로 든다면 CSRF에 매우 취약할수 밖에 없고 이는 꼭 신경써 줘야하는 부분이되는것이다. 왜냐하면 세션은 stateful 하기때문에 상시 포함하여 전송하기 때문에 노출이 굉장히 쉽다.
'Spring > 👨💻 SpringSecurity' 카테고리의 다른 글
AnonymousAuthenticationFilter (0) | 2023.06.26 |
---|---|
RememberMeAuthenticationFilter (0) | 2023.06.26 |
CuncurrentSesseionFilter (0) | 2023.06.26 |
SessionManagementFilter(동시 세션 제어 / 세션 고정 보호 / 세션 정책) (0) | 2023.06.26 |
Logout (0) | 2023.06.26 |