1. 스프링 시큐리티란?
스프링 시큐리티는 스프링 기반의 어플리케이션의 보안(인증과 권한)을 담당하는 프레임워크이다. 만약 스프링시큐리티를 사용하지 않았다면, 자체적으로 세션을 체크하고 redirect 등을 해야할 것이다. 스프링 시큐리티는 보안과 관련해서 체계적으로 많은 옵션들로 이를 지원해준다. spring security는 filter 기반으로 동작하기 때문에 spring MVC 와 분리되어 관리 및 동작한다. 참고로 security 3.2부터는 XML로 설정하지 않고도 자바 bean 설정으로 간단하게 설정할 수 있도록 지원한다.
1-1 보안 관련 용어
- 접근 주체(Principal) : 보호된 대상에 접근하는 유저
- 인증(authenticate) : 현재 유저가 누구인지 확인(예: 로그인)
- 애플리케이션의 작업을 수행할 수 있는 주체임을 증명 - 인가(Authorize) : 현재 유저가 어떤 서비스, 페이지에 접근할 수 있는 권한이 있는지 검사
- 권한 : 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 허락되어있는지를 결정
- 권한 승인이 필요한 부분으로 접근하려면 인증 과정을 통해 주체가 증명되어야만 한다.
- 권한 부여에도 두 가지 영역이 존재하는데, 웹 요청 권한, 메소드 호출 및 도메인 인스턴스에 접근 권한 부여
2. Spring Security의 구조
2-1 인증관련 architecture
- AuthenticationFilter (UsernamePasswordAuthenticationFilter)는 사용자의 요청을 가로챈다. 그리고 인증이 필요한 요청이라면 사용자의 JSESSIONID가 Security Context에 있는지 판단한다. 없으면 로그인 페이지로 이동시킨다.
로그인 페이지에서 요청이 온 경우라면 로그인 페이지에서 입력받은 username과 password를 이용해 UsernamePasswordAuthenticationToken을 만든다. 그리고 UsernamePasswordAuthenticationToken 정보가 유효한 계정인지 판단하기 위해 AuthenticationManager로 전달한다. - AuthenticationManager 인터페이스의 구현체는 ProviderManger이고 AuthencationProvider에게 비밀번호 인증 로직 책임을 넘긴다. (AuthencationProvider는 개발자가 직접 커스텀해서 비밀번호 인증로직을 직접 구현할 수 있다.
- AuthencationProvider는 UserDetailsService를 실행해 비밀번호 인증 로직을 처리한다. UserDetailsService는 DB에 저장된 회원의 비밀번호와 비교해 일치하면 UserDetails 인터페이스를 구현한 객체를 반환하는데, UserDetailsService는 인터페이스이며 UserDetailsService를 구현한 서비스를 직접 개발해야한다.
- 인증 로직이 완료되면 AuthenticationManager는 Authentication를 반환하며, 결과적으로 SecurityContext에 사용자 인증 정보가 저장된다.
- 인증 과정이 끝났으면 AuthenticationFilter에게 인증에 대한 성공 유무를 전달하고성공하면 AuthenticationSuccessHandler를 호출하고 실패하면 AuthenticationFailureHandler를 호출한다.
참고👇
https://sjh836.tistory.com/165
https://bamdule.tistory.com/52
'개발이야기 > JAVA' 카테고리의 다른 글
코딩 테스트 연습 - 완주하지 못한 선수 (0) | 2021.05.05 |
---|