CSRF란 무엇인가
CSRF 무엇인가
CSRF 공격(Cross Site Request Forgery)
- CSRF(Cross-Site Request Forgery)는 악성 웹 사이트 공격 유형입니다. CSRF 공격을 원클릭 공격 또는 세션 라이딩이라고도 합니다. 이 공격 유형은 웹 사이트가 신뢰하는 사용자로부터 권한 없는 요청을 전송합니다.
- 위조 요청을 전송하는 서비스(페이스북, 카카오, 네이버 기타 등등..)에 희생자가 로그인 상태
- 희생자가 해커가 만든 피싱 사이트에 접속
- 정상적인 사용자가 의도하지 않았지만, 자신도 모르게 서버를 공격하게 되는 경우입니다.
- 공격자가 만든 악성 페이지를 통해 사용자는 자신도 모르게 공격을 수행합니다.
Spring Security
를 통하여 csrf 공격을 방어하게 됩니다. 하지만정확히 어떤 느낌인진 잘 모르겠죠
정상적인 로그인을 통하여 서버에 요청하는 것이 아닌 공격자가 서버에 지속적으로 요청하게 되는 공격 정도라고만 이해하고 내려가보시죠
@Bean
protected SecurityFilterChain webSecurityFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> {
auth.requestMatchers(
"/",
"/login/*",
"/logout",
"/favicon.*",
"/error"
).permitAll();
auth.anyRequest().authenticated();
})
.oauth2Login(config -> {
config.userInfoEndpoint(userInfoEndpointConfig -> {
userInfoEndpointConfig.userService(oAuthService);
});
//config.successHandler()
config.defaultSuccessUrl("/");
}) // OAUTH2.0 google 로그인 허용
.formLogin(formLogin -> formLogin.disable()) // 기본 로그인 허용 X
.cors(Customizer.withDefaults()) // CORS 기본 CorsConfigurationSource 사용
.csrf(csrf -> csrf.disable()) // CSRF 방어 로직
.build();
}
일단 선행되어야 할 것은 Session 과 Cookie에 대해 알아보겠습니다.
Session 과 Cookie
- 서버는 로그인 시 인증된 사용자의 정보를 세션(session)에 저장하고, 이를 찾을 수 있는 sessionID을 만듭니다.
- 서버는 저장된 세션 정보를 클라이언트(브라우저)가 사용할 수 있도록 sessionID를 Set-Cookie 헤더에 담아서 전달합니다.
- 클라이언트(브라우저)는 전달된 sessionID를 쿠키에 저장합니다.
- 클라이언트(브라우저)는 해당 도메인을 가진 서버로 요청 시 쿠키에 저장된 sessionID를 자동으로 전달합니다.
- 서버는 쿠키에 담긴 sessionID를 통해 인증된 사용자인지 여부를 확인합니다.
클라이언트(브라우저)와 서버는 Session과 Cookie를 통해 서로를 파악한 후에 누구인지 어디서 이용하는지 알 수 있습니다.
그러므로 이미 보안이 취약한 서버에 로그인 후에 클라이언트에 저장된 Cookie를 링크든 어떤 방법으로든 빼앗아 서버에 인증을 통해 공격하는 형태입니다.
예전의 MVC 구조에서는 세션과 쿠키를 관리하기도하여 보안이 취약했지만,
요즘에는 쿠키 대신에 로컬 스토리지(localStorage)와 요청 헤더(Request Header) 사용하거나, 세션 대신에 JWT(Json Web Token)을 사용하기 때문에 보다 안전하도록 설계한다고 합니다.
추가적으로 csrf.disable()
잡지 못하는 부분은 클라이언트의 요청에 Referer
, Host
를 꺼내여 요청한 곳이 어디인지 정확히 파악하여 csrf 공격을 막을 수 있습니다.
Spring의 같은 경우 interceptor를 이용하여 dispatcher servlet에 오기 전 체크하여 걸러낼 수 있습니다.
이와 같이 간단하게 csrf에 대해 알아보았습니다.
댓글남기기