[Spring]Spring Security를 이용한 로그인처리-(3)

윤재열·2022년 3월 25일
0

Spring

목록 보기
44/72

CSRF설정

  • 스프링 시큐리티는 기본적으로 CSRF(Cross Site Request Forgery-크로스 사이트 요청 위조)라는 공격을 방어하기 위해서 임의의 값을 만들어서 이를 GET 방식을 제외한 모든 요청 방식에 포함시켜야만 정상작동이 가능합니다.
  • CSRF공격은 '사이트간 요청 위조'라고 번역할 수 있습니다.
  • 서버에서 받아들이는 정보가 특별히 사전 조건을 검증하지 않는다는 단점을 이용하는 공격 방식입니다.
  • CSRF를 이용해서 단순히 게시물의 조회수를 늘리는 등의 조작부터 피해자의 계정을 이용하는 다양한 공격이 가능합니다.

CSRF공격의 예

  • 예를 들어 A라는 사이트가 있다고 가정해 봅니다.
  • A사이트에는 특정 사용자의 등급을 변경하는 URL이 존재하는 것을 공격자가 알았고, 해당 URI에는 약간의 파라미터가 필요하다는 것을 알았다고 가정합니다.
  • 공격자는 A사이트의 관리자가 자주 방문하는 B사이트에 <img>태그나 <form>태그를 이용해서 위의 URI를 추가한 게시물을 작성합니다.
  • A사이트의 관리자는 자신이 평상시에 방문하던 B사이트를 방문하게 되고 공격자가 작성한 게시물을 보게 됩니다.
  • 이때 <img>태그 등에 사용된 URI가 호출되고 서버에는 로그인한 관리자의 요청에 의해서 공격자는 admin등급의 사용자로 변경됩니다.
  • A사이트의 관리자는 자신이 관리하던 A사이트에 로그인이 되어 있는 상태라면 A사이트에 서버 입장에서는 로그인한 사용자의 정상적인 요청으로 해석됩니다.
  • CSRF공격은 서버에서 받아들이는 요청을 해석하고 처리할 때 어떤 출처에서 호출이 진행되었는지 따지지 않기 때문에 생기는 허점을 노리는 공격방식 입니다.
  • '사이트간 요청 위조'라고 하지만 현실적으로는 하나의 사이트 내에서도 가능합니다.
  • CSRF는 <img>태그 등의 URI등을 이용할 수 있기 때문에 손쉽게 공격할 수 있는 방법이 됩니다.
  • 현재 프로젝트에서 자동으로 만들어지는 로그인 페이지는 '페이지 소스 보기'기능으로 내용을 살펴보면 아래 화면 처럼 hidden값으로 만들어진 CSRF토큰 값이 있습니다.
  • CSRF토큰은 기본적으로 세션당 하나씩 생성되기 때문에 아래 그림과 같이 세션이 다른 사용자는 다른 값으로 생성됩니다.
  • 일반적으로 세션을 이용하고, <form>태그를 이용하는 방식에서는 CSRF토큰이 보안상으로 권장되지만, REST방식 등에서 매번 CSRF 토큰의 값을 알아내야 하는 불편함이 있기 때문에 경우에 따라서는 CSRF토큰의 발행을 하지 않는 경우도 있습니다.

CSRF토큰 비활성화

  • HttpSecurity의 csrf()메서드를 이용해서 CSRF토큰을 발행하지 않도록 설정하기 위해서는 아래와 같이 간단한 설정을 추가할 수 있습니다.

  • 위와 같이 disable()을 지정한 후에 만들어지는 로그인 페이지의 코드는 디자인의 차이는 없지만 CSRF 토큰이 필요하지 않은 상태로 만들어집니다.

logout 설정

  • formLogin()과 마찬가지로 logout()메서드를 이용하면 로그아웃 처리가 가능합니다.
  • formLogout()역시 로그인과 마찬가지로 별도의 설정이 없는 경우에는 스프링 시큐리티가 제공하는 웹 페이지를 보게 됩니다.
    -SecurityConfigdp logout()을 적용해주기만 하면 됩니다.
 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/sample/all").permitAll()
                .antMatchers("/sample/member").hasRole("USER");

        http.formLogin();//인증/인가에 문제시 로그인 화면
        http.csrf().disable();
        http.logout();
    
  • logout()에서 주의해야 할점은 CSRF 토큰을 사용할 때는 반드시 POST 방식으로만 로그아웃을 처리한다는 점입니다.
  • CSRF토큰을 이용하는 경우에는 '/logout'이라는 URL을 호출했을 때 <form>태그와 버튼으로 구성된 화면을 보게 됩니다.
  • 반면에 CSRF토큰을 disable()로 비활성화 시키면 'GET방식'으로도 로그아웃이 처리됩니다.
  • 로그아웃도 formLogin()과 마찬가지로 사용자가 별도의 로그아웃관련 설정을 추가할 수 있습니다.
  • logoutUrl(),logoutSuccessUrl() 등을 지정할 수 있습니다.
  • 스프링 시큐리티는 기본적으로 HttpSession을 이용하는데 invalidatedHttpSession()과 delteCookies()를 이용해서 쿠키나 세션을 무효화 시킬 수 있도록 설정할 수 있습니다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글