[Spring] 스프링 시큐리티 커스터마이징

[Spring] 스프링 시큐리티 커스터마이징

스프링 시큐리티의 커스터마이징을 수행합니다.


스프링 시큐리티는 별도의 설정 없이도 기본적으로 동작하지만 개발 시에는 적절하게 인증 방식이나 접근 제한을 지정할 수 있어야 합니다.
기존의 스프링 시큐리티 커스터마이징은 webSecurityConfigurerAdapter를 상속하는 방식으로 작성 가능했지만 이는 보안상의 문제로 인해 deprecate 되었습니다.
이제는 FilterChain Bean을 등록하는 방식을 통해 스프링 시큐리티를 제어할 수 있습니다.



1. SecurityConfig - passwordEncoder() 작성



1

가장 먼저 설정하는 것은 PasswordEncoder라는 객체입니다. PasswordEncoder는 패스워드를 인코딩하는 것으로 주 목적은 패스워드를 암호화하는 것입니다.
인증을 위해서는 반드시 PasswordEncoder를 지정해야만 합니다.
스프링 시큐리티는 여러 종류의 PasswordEncoder를 제공하는데 그중 가장 많이 사용되는 BCryptPasswordEncoder를 사용합니다.
@Bean을 이용해 BCryptPasswordEncode를 지정합니다.

2. PasswordTest - testEncode() 작성



2

PasswordEncoder의 테스트를 위해 test 경로에 PasswordTest 클래스를 생성합니다.
PasswordEncoder를 주입한 후 ‘1111’이라는 문자열을 인코딩해 나온 결과와 matches()를 통해 비교합니다.
이런 인코딩 결과는 테스트 코드를 실행할 때 마다 바뀌는 것을 알 수 있습니다.
암호화된 비밀번호는 잠시 후 사용해야 하니 메모장에 복사해 기록합니다.

3. SecurityConfig - userDetailService() 작성



3

암호화된 패스워드를 사용해 인증(Authentication)을 하기 위해서는 해당 암호를 사용하는 사용자가 필요합니다. 이를 위해 userDetailsService() bean을 작성합니다.
userDetailsService()는 Bean으로 ImMemoryUserDetailsManager에 user에 대한 정보를 담은 뒤 반환합니다.
user1의 아이디와 인코딩된 패스워드, 그리고 역할을 지정해 단순한 테스트를 수행하는 용도의 계정을 생성합니다.

4. JSESSIONID 쿠키 삭제



4

앞선 예제를 이어서 수행할 경우 쿠키에 로그인 정보가 남아있을 수 있습니다.
개발자 도구를 통해 JSSSEIONID 쿠키를 삭제할 경우 로그아웃을 수행할 수 있습니다.
만약 로그인 정보가 없을 경우 이 과정은 수행하지 않습니다.

5. SecurityConfig - userDetailService() 결과



5

프로젝트를 실행한 후 ‘sample/all’에 접근한 후 userDetailService()를 통해 만든 계정으로 로그인을 수행할 경우 정상적으로 로그인에 성공한 것을 확인할 수 있을 것입니다.

6. SecurityConfig - filterChain() 작성



6

인증을 위한 리소스 설정을 마쳤으니 인가(Authorization)를 위한 리소스를 설정하겠습니다.
먼저 securityFilterChain을 리턴타입으로 가지는 filterChain() bean을 등록합니다. filterCahin()의 경우 HttpSecurity를 매개변수로 받은 뒤 필터를 추가한 후 http를 build()한 후 반환합니다.
해당 http에는 authorizeHttpRequest()와 requestMathers()를 사용해 url의 접근 권한을 지정할 수 있습니다.
‘/sample/all’의 경우 permitAll()을 사용해 모두 접근할 수 있도록 하고 ‘/sample/member’의 경우 hasrole()을 사용해 USER 권한을 가진 자만 접근할 수 있도록 설정합니다.

7. SecurityConfig - filterChain() 결과



7

프로젝트를 실행한 뒤 ‘/sample/member’를 호출할 경우 위 그림과 같이 Access가 거부되는 것을 확인할 수 있습니다.

8. SecurityConfig - filterChain() 수정



8

filterChain()에 http.formLogin()을 작성할 경우 권한이 없을 때 로그인 페이지를 보여주도록 지정할 수 있습니다.

9. SecurityConfig - filterChain() 수정 결과



9

http.formLogin()을 추가한 뒤 프로젝트를 실행한 결과 자동으로 로그인 페이지로 이동하는 것을 확인할 수 있습니다.

10. 로그인 결과



10

user1 계정으로 로그인을 수행한 결과 정상적으로 ‘sample/member’에 접근한 것을 확인할 수 있습니다.

11. SecurityConfig - filterChain() 수정 2



11

filterChain의 csrf 토큰을 disable()로 전환합니다.
http.logout()을 사용하면 GET 방식’/logout’을 통해 로그아웃을 처리할 수 있습니다.

12. SecurityConfig - filterChain() 수정 2 결과



12

실행중이던 member 페이지에서 ‘/logout’을 통해 로그아웃한 결과 정상적으로 로그아웃이 처리된 것을 확인할 수 있습니다.


© 2022. All rights reserved.