개발하기 위한 여러 가지 서비스 제공 u 다양한 프로젝트 u Spring Boot : Spring의 설정을 최소화한 것 u Spring Data : 데이터베이스 접근을 위한 일관되고 추상화된 모델 제공 u Spring Cloud : 분산 시스템의 공통적인 패턴을 모아 제공 u Spring MVC : Model-View-Controller 기반의 웹 프레임워크 u Spring Security : Spring Application의 보안(인증과 권한 등)을 담당
기본적인 보안 기능 u 인증(Authentication)과 인가(Authorization) u 인증(Authentication) ⇨ “이 앱의 사용자가 맞는가?” (Who?) u 인가(Authorization) ⇨ “그 사용자가 리소스를 다룰 수 있는가?” (Can?) u 강화된 보안 기능 u 세션 관리 u CSRF 방지 u 브라우저의 보안 기능과의 연계 u …
FilterChainProxy 클래스(서블릿 필터)가 요청을 받고, HttpFirewall 메서드를 호출해서 HttpServletRequest와 HttpServletResponse에 대한 방화벽 기능 수행 3. SecurityFilterChain에 설정돼 있는 보안 필터 클래스에 처리 위임 4. SecurityFilterChain은 여러 보안 필터가 연쇄적으로 연결된 형태. 앞 필터 처리 후, 뒤 필터가 뒤이어 호출. 5. 마지막 보안 필터 처리 후, 남은 서블릿 필터나 서블릿이 실행되어 웹 애플리케이션의 리소스에 접근 6. FilterChainProxy 클래스는 웹 애플리케이션에서 반환한 리소스를 클라이언트에 전달
u 사용자 정보를 데이터 저장소에 등록해 두고, 입력 정보와 비교하는 방법 u HTML 입력 폼을 사용하는 방식 u RFC에서 정해진 HTTP 표준 인증 방식(Basic 인증, Digest 인증 등)을 이용 u OpenID 인증이나 Single Sign On 인증 같은 인증 방식 이용
필터(Authentication Filter)는 요청 파라미터에서 자격정보를 구한 다음, AuthenticationManager 클래스의 인증 메서드를 호출한다. 3.ProviderManager(AuthenticationManager의 기본 구현 클래스)는 실제 인증 처리를 AuthenticationProvider 인터페이스의 구현 클래스에 위임한다.
자격정보(사용자명과 패스워드)를 요청 파라미터로 전송한다. 2.UsernamePasswordAuthenticationFilter 클래스는 요청 파라미터에서 자격정보를 구한 다음, AuthenticationManager를 통해 해당 이용자가 인증된 사용자인지 확인한다. 3.인증에 성공한 경우 AuthenticationSuccessHandler 메서드를 호출, 실패한 경우 AuthenticationFailureHandler 메서드를 호출해서 화면을 이동시킨다.
WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 생략 http.formLogin(); } } 설정만 잘 했다면, ‘/login’ 경로로 GET 요청 시, 기본 로그인 폼 표시되고, 로그인 버튼을 누르면 POST 요청으로 인증 처리가 수행됨
사용하는 경우는 거의 없다.. u 직접 만든 로그인 폼이 있다고 가정하고 적용하는 방법? u “src/main/webapp/views/” 아래에 loginForm.jsp라는 로그인 폼 파일이 이미 있다고 가정 u 로그인 폼을 표시하기 위한 Controller @Controller public class AuthenticationController { @RequestMapping(path = "/login", method = RequestMethod.GET) public String viewLoginForm() { return "loginForm"; } }
자격정보(사용자명과 패스워드)와 사용자의 상태 정보를 제공하기 위한 인터페이스로서 다음과 같은 메서드가 정의돼 있다. public interface UserDetails extends Serializable { String getUsername(); // 사용자명 반환 String getPassword(); // 등록된 패스워드 반환(패스워드 틀리면 BadCredentialsException 발생) boolean isEnabled(); // 유효한 패스워드인지 판단 boolean isAccountNonLocked(); // 계정의 잠금 상태를 판단 boolean isAccountNonExpired(); // 계정의 유효 기간 상태를 판단 boolean isCredentialsNonExpired(); // 자격정보의 유효 기간 상태를 판단 Collection<? extends GrantedAuthority> getAuthorities(); // 사용자가 가진 권한 리스트 반환 (인가 처리를 할 때 필요) }
클래스는 AccessDecisionManager 인터페이스의 메서드를 호출하고 리소스에 대한 접근 가능 여부를 확인한다. 3. AffirmativeBased 클래스는 AccessDecisionVoter 인터페이스의 메서드를 호출하고 접근 가능 여부에 대한 투표 결과를 받는다. 4. FilterSecurityInterceptor는 AccessDecisionManager가 허용할 때만 리소스의 접근을 허락한다.
공통 표현식 표현식 설명 hasRole(String role) 해당 롤을 가지고 있는 경우 true hasAnyRole(String… roles) 해당 롤 중에 하나를 가지고 있는 경우 true isAnonymous() 익명 사용자인 경우 true isRememberMe() Remember Me 인증을 통해 로그인한 경우 true isAuthenticated() 이미 인증된 사용자인 경우 true isFullyAuthenticated() Remember Me가 아닌 일반적인 인증 방법으로 로그인한 경우 true permitAll 항상 true denyAll 항상 false principal 인증된 사용자의 사용자 정보(UserDetails 구현한 클래스의 객체) 반환 authentication 인증된 사용자의 인증 정보(Authentication 구현한 클래스의 객체) 반환
대한 인가(자바 기반 설정) u 접근 정책을 적용할 웹 리소스를 지정한다. 표현식 설명 hasIpAddress(String ipAddress) 인수에 지정한 IP 주소 체계에 클라이언트의 IP 주소가 일치하는 경우에 true 반환 표현식 설명 antMatchers ant 형식으로 지정한 경로 패턴과 일치하는 리소스를 적용 대상 regexMatchers 정규 표현식으로 지정한 경로 패턴과 일치하는 리소스를 적용 대상 requestMatchers 지정한 RequestMatcher 인터페이스 구현과 일치하는 리소스를 적용 대상 anyRequest 기타 리소스를 적용 대상
4.0부터는 기본 적용되는 기능 u 따로 뭔가를 정의할 필요가 없다 u 하지만 CSRF 방지 기능을 적용하고 싶지 않을 때는 명시적으로 비활성해야 한다. @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); }