configuration에 bean으로 등록해둔 defaultSecurityFilterChain 내부에 다음과 같이 CORS 설정을 진행하면 된다.
우선 .cors 메소드에서 .configurationSource를 설정해야한다.
내부 인자로 CorsConfigurationSource 인터페이스를 구현한 객체를 전달해준다.
CorsConfigurationSource 인터페이스는 getCorsConfiguration메소드를 사용함으로서 객체를 받을 수 있다.
getCorsConfiguration 메소드 내부에서는 CORS 설정을 진행해주면 된다.
setAllowedOrigins, setAllowedMethods 등등,, 위에서 언급했던 부분들을 getCorsConfiguration 메소드 내부에 정의해주면 설정된 정보를 포함하는 CorsConfiguration 객체가 반환되고 그것을 사용하여 CORS 설정을 할 수 있다.
CSRF에 관하여
CSRF는 보안 공격으로 주로 해커들이 사용하는 방법이다.
기본적으로 스프링 시큐리티는 데이터베이스에 접근하는 어떠한 포스트 작업을 허용하지 않음으로서 CSRF로 부터 데이터베이스를 보호한다.
CSRF 상황 설명
넷플릭스 시청을 위해 로그인을 한다.
로그인을 하면 쿠키가 생성되고 이를 브라우저에 netflix.com이라는 도메인으로 저장해둔다.
영화를 다 보고 유저가 evil.com에 접속한다.
evil.com엔 여러가지 유혹 광고들이 있다.
링크를 클릭하면 위의 예시 코드가 실행되고, netflix.com에 post 요청이 일어나면서, 넷플릭스의 아이디와 비밀번호가 바뀌게 되는 것이다.
CSRF 공격을 해결하는 방법
CSRF 공격을 대비하기 위해선, 정당한 유저에게 들어오는 요청인지 해커 웹사이트에서 들어오는 요청인지를 확인할 필요가 있다.
현재 두 요청 모두 유효한 쿠키와 인증을 갖고 있기 때문에 구분할 수 없다.
그렇기에 새로운 토큰을 인증에 사용할 것이다.
토큰의 이름은 CSRF 토큰으로 랜덤하게 생성되는 토큰이다.
이 토큰은 엔드 유저의 세션마다 고유하게 할당되며, 랜덤으로 값을 지정한다.
CSRF 토큰이 있다면 백엔드에서 정당한 유저와 해커 웹사이트를 구분할 수 있을것이다.
토큰을 사용했을 시 CSRF 상황 설명
넷플릭스 시청을 위해 로그인을 한다.
로그인을 하면 쿠키가 생성되고 이를 브라우저에 netflix.com이라는 도메인으로 저장해둔다.
하나의 CSRF 쿠키가 더 생성되어 브라우저에 저장된다.
유저가 evil.com에 접속한다.
링크를 클릭힌다.
해커 사이트에서 넷플릭스의 계정을 바꾸게 하는 동일한 코드가 전송된다.
브라우저에서 넷플릭스 도메인에 두 가지 쿠키를 전송하려한다.
한 개는 인증과 관련된 쿠키, 한 개는 CSRF와 관련된 쿠키이다.
그러나 CSRF 토큰은 기존의 브라우저에 단순히 저장되지 않고, 여러가지 형식들로 저장되기 때문에 기존에 인증 관련 쿠키에 접근하던것처럼 동일한 방식으로 접근이 불가능하다.
결국 악성 사이트에서 인증 관련 쿠키만이 보내지게 되고, CSRF 토큰이 없으므로 넷플릭스에선 접근을 거부한다.
public api에 대한 CSRF 보안 해제하기
누구나 공개적으로 접근할 수 있는 post 요청에 대해선 csrf 보안을 설정할 이유가 없다.