java, spring

CSRF(Cross-site request forgery) 공격과 토큰 / 로그인 처리 / 로그아웃 처리

isaac.kim 2021. 9. 27. 23:29
728x90
반응형

CSRF(Cross-site request forgery) 공격과 토큰 / 로그인 처리 / 로그아웃 처리

 

도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^

 

이전 글

2021.09.27 - [Spring] - [Spring] 스프링 시큐리티를 사용하는 커스텀 로그인 페이지

2021.09.25 - [Spring] - [Spring] 스프링 시큐리티 간단한 로그인과 로그아웃 처리

2021.09.24 - [Spring] - [Spring] Spring Web Security의 설정

2021.09.24 - [Spring] - [Spring] Spring Web Security

 

스프링 시큐리티에서 POST 방식을 이용하는 경우 CSRF 토큰이라는 것을 이용하게 됩니다. 별도의 설정이 없다면 스프링 시큐리티가 적용된 사이트의 모든 POST 방식에는 CSRF 토큰이 사용되는데 '사이트간 위조 방지'를 목적으로 특정한 값이 토큰을 사용하는 방식입니다.

 

CSRF 공격은 '사이트간 요청 위조'로 번역될 수 있습니다. 서버에서 받아들이는 정보가 특별히 사전 조건을 검증하지 않는다는 단점을 이용하는 공격 방식입니다.

 

CSRF 공격 자체가 사용자의 요청에 대한 출처를 검사하지 않아서 생기는 허점이기 때문에 사용자의 요청에 대한 출처를 의미하는 referer 헤더를 체크하거나 일반적인 경우에 잘 사용되지 않고 REST 방식에서 사용되는 PUT, DELETE와 같은 방식을 이용하는 등의 방식을 고려해 볼 수 있습니다.

반응형

 

CSRF 토큰

CSRF 토큰은 사용자가 임의로 변하는 특정한 토큰값을 서버에서 체크하는 방식입니다. 서버에는 브라우저에 데이터를 전송할 때 CSRF 토큰을 같이 전송합니다. 사용자가 POST 방식 등으로 작업할 때 브라우저에서 전송된 CSRF 토큰의 값과 서버가 보관하고 있는 토큰의 값을 비교합니다. 만일 CSRF 토큰 값이 다르면 작업하지 않는 방식입니다.

 

서버에서 생성되는 토큰은 일반적으로 난수를 생성해서 공격자가 패턴을 찾을 수 없도록 합니다.

 

 

스프링 시큐리티의 CSRF 설정

CSRF 토큰은 세션을 통해 보관하고, 브라우저에서 전송된 CSRF 토큰값을 검사하는 방식으로 처리합니다. 스프링 시큐리티에서는 CSRF 토큰 생성을 비활성화하거나 CSRF 토큰을 쿠키를 이용해 처리하는 등의 설정을 지원합니다.

 

security-context.xml


 

로그인 성공과 AuthenticationSuccessHandler

로그인을 처리하다 보면 로그인 성공 이후에 특정한 동작을 하도록 제어하고 싶은 경우가 있습니다.

예로 만일 로그인할 때 admin 계정으로 로그인 했다면 사용자가 어떤 경로로 로그인 페이지로 들어오면 무조건 /sample/admin 으로 이동하게 하거나, 별도의 쿠키 등을 생성해서 처리하고 싶은 경우를 생각해볼 수 있습니다.

 

이 경우 AuthenticationSuccessHandler 인터페이스를 구현해서 설정할 수 있습니다.

 

com.project.security 패키지에 CustomLoginSuccessHandler 클래스를 추가합니다.

 

CustomLoginSuccessHandler는 로그인 한 사용자에 부여된 권한 Authentication 객체를 이용해서 사용자가 가진 모든 권한을 문자열로 체크합니다. 만일 사용자가 'ROLE_ADMIN' 권한을 가졌다면 로그인 후에 바로 '/sample/admin'으로 이동하게 하는 방식입니다.

 

security-contex.txml에 작성한 CustomLoginSuccessHandler를 빈으로 등록하고 로그인 성공 후 처리를 담당하는 핸들러로 지정합니다.

 

'/customLogin' 페이지에서 로그인하면 사용자 권한에 따라 다른 페이지를 호출하는 것을 확인할 수 있습니다.


로그아웃의 처리와 LogoutSuccessHandler

 

로그인과 마찬가지로 로그아웃 처리에 특정 URI를 지정 및 로그아웃 후 직접 로직을 처리할 수 있는 핸들러를 등록할 수 있습니다.

 

security-context.xml

 

로그아웃 시 세션을 무효화 시키는 설정이나 특정한 쿠키를 지우는 작업을 지정할 수 있습니다. com.project.controller 패키지의 CommonController에 GET 방식으로 로그아웃을 결정하는 페이지에 대한 메서드를 처리합니다.

 

CommonController 클래스의 일부

views 폴더에는 customLogout.jsp를 추가합니다.

customLogout.jsp

 

로그아웃 역시 로그인과 동일하게 실제 작업은 '/customLogout'으로 처리하고 post 방식으로 이뤄 집니다. POST 방식으로 처리되기 때문에 CSRF 토큰값을 같이 지정합니다.

 

POST 방식으로 처리되는 로그아웃은 스프링 시큐리티의 내부에서 동작합니다. 만일 로그아웃 시 추가적인 작업을 해야 한다면 logoutSuccessHandler를 정의해서 처리합니다.

 

로그아웃 테스트를 위해 /sample/admin 페이지에 로그아웃 페이지로 이동하는 링크를 추가합니다.

테스트


스프링 시큐리티의 CSRF 토큰과 로그인, 로그아웃 처리를 알아보았습니다.

 

도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
728x90
반응형