본문 바로가기

Spring_SpringBoot/코드

[ Spring Security 6 ] - 2 , SecurityConfig

이 부분은 SpringSecurity를 Filter에 등록하게 되면서 주요한 설정들을 담는 클래스이다.

 

 

1) CORS 예방

 

 

나의 프론트 서버는 3000번이고 백엔드 서버는 8080이다. 당연히 동일 출처 정책에 위배되므로

CORS 에러가 나게 된다. 그러므로 filter에게 알려주는데 이것이 CorsConfigurationSource 객체이다.

 

1) CorsConfiguration 

→ 3000번에서 오는 요청에 대해 다 허용한다는 의미이다.

 

2) UrlBasedCorsConfigurationSource

→ 3000번에서 오는 것 중에 모든 urI를 허용해주는 것이다.

 

2) 정적 리소스 filter 제외

 

1) *.js, *.css, *.image같은 경우는 필터를 거치지 않고 그냥 다 받아준다는 의미이다.

    → 보안강화용으로는 저런 것도 설정해주면 좋겠지만 나는 패스했다.

 

3) 인증 실패 접근 제한

 

1) 인증이 필요한 페이지에 갔을 때 401에러를 띄워주는 부분이다.

    ex) 로그인이 되지 않았는데 로그인이 필요한 페이지에 들어갈 때

 

4) 인가 실패 접근 제한

 

1) 인가가 필요한 페이지에 갔을 때 403에러를 띄워주는 부분이다.

    ex) 로그인은 되었지만 관리자 페이지에 못 들어가는 것을 예시로 볼 수 있다.

5) 사용자 입력 아이디 비밀번호 데이터 가공

 

1) 기본적으로 Spring Security는 아이디는 String username, 비밀번호는 String password로 기본 default설정한다.

    여기서 나는 front단에서 JSON객체로 넘겨줬기 때문에 데이터 핸들링 후 String으로 변환하는 로직을 짰다.

6) 사용자 로그인 체크와 권한 부여

 

1) 실질적인 아이디와 비밀번호의 성공, 실패 처리는 AuthenticationManager 객체가 담당한다. 그러므로 성공

    실패에 대한 로직을 추가하기 위해서 Bean에 등록

 

7) 성공 처리, 실패 처리

 

1) AuthenticationSuccessHandler와 AuthenticationFailureHandler는 아이디, 비밀번호 성공, 실패하는 로직이다.

 

8) SavedRequest 설정

 

1) 로그인을 시도하려는 urI를 저장해서 로그인 성공 시 보내주기 위한 객체이다.

 

Spring Security가 진행되는 순서로 번호를 매겼다.

=======================================================================================

 

① : 인증, 인가 실패에 대한 Exception을 설정해주는 것이다. 위 4), 5)을 통해서 확인할 수 있다.

② : URI허용에 대한 부분이다. requestMatchers는 해당 URI는 인증, 권한 체크를 하겠다는 의미이다.

       → SpringSecurity 6이전에 antMatchers는 delegrated됐다.

③ : 로그인에 대한 성공과 실패에 대한 처리를 formLogin을 통해서 해준다.

       나의 경우는 프론트 단에서 form을 통해서 Submit하는 것이다.

 

④ : 로그인에 대한 성공과 실패에 대한 처리를 formLogin을 통해서 해준다.

       나의 경우는 프론트 단에서 form을 통해서 Submit하는 것이다.

       → 설정하지 않으면 성공은 "/login.do"이고 실패는 "/login.do?error"가 Default이다.

 

⑤ : 여기 부분으로 개인적으로 가장 많이 애를 먹었다. 원래 SpringSecurity는 SecurityContextHolder

      이 전체적으로 관리하는 기능이다. 그런데 이전 버전에서는 저 설정을 하지 않아도

      Authentication을 통해서 로그인이 성공이 되면 자동으로 SecurityContextHolder에 권한이랑

      인가 정보가 저장이 됐다. 그런데 SpringSecurity6 이후 부터는 직접 지정해줘야한다.

 

⑥ : AuthenticationManager가 사용자의 아이디와 비밀번호에 대한 처리를 한다고 했다.

      그런데 입력 값(아이디, 비밀번호)에 대한 데이터 가공을 하기 위해서는 저것을 설정해줘야 한다.

      예를 들어 필자의 경우는 String username, String password를 받아오지 않고

      {"username":"john.doe","password":"password123"} 이런식으로 받아왔기 때문에 가공이

      필요했다.