Spring Security

WebStudy/Spring / / 2021. 8. 3. 17:43

Spring Security

  • Spring Security
    • 인증과 권한 제어에 필요한 필터 모음
    • 필터를 기반으로 권한에 따른 접근 제어 기능, 패스워드 암호화 등 전반적인 기능 포함함

인증

  • Authentication
    • 입력받은 정보와 사용자 정보를 비교해서 신원을 확인하는 것
  • AuthenticationManager, Authentication의 인터페이스와 클래스 존재
  • Spring Security는 기본적으로 HTTP 기본 인증 방식으로 동작
    • DB에 저장된 사용자 정보와 인증을 연동하기 위해서는 AuthenticationManager 설정 필요

인가

  • Authorization
    • 인증과정을 통해서 사용자를 식별한 후 사용자가 가진권한을 확인하여 해당 사용자 권한에 맞게 접근을 허용하는 것
  • Spring Security는 Role 기반으로 권한 관리를 함
  • Role
    • 접속한 사용자가 사이트에서 수행하는 역할
    • Role에 따라 페이지 접근 허용 여부를 결정함

인증 흐름

  1. 사용자가 처음 사이트에 접속
  2. 인증 정보가 필요한 화면은 Spring Security의 인증을 통과한 후에 접근 가능
    • 인증 정보는 DB에서 가져옴
  3. 인증에 실패 시 다시 로그인 페이지
  4. 로그인 후 로그아웃 시 권한이 필요없는 첫 페이지

회원 가입

접근 경로 설정

SecurityConfig 설정

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            //접근 허용
            .antMatchers("/css/**", "/js/**", "/images/**", "/resources/**", "/h2-console/**", "/webjars/**", "/signup", "/home", "/").permitAll()
            .anyRequest().authenticated()
            .and()
            //iframe 허용
            .headers().
            frameOptions().disable()
            .and()
            //DB 어드민 접속 허용
            .csrf()
            .ignoringAntMatchers("/h2-console/**")
            .and()
            //로그인
            .formLogin()
            .loginPage("/login")
            .loginProcessingUrl("/sign-in")
            .defaultSuccessUrl("/welcome")
            .failureUrl("/login?error")
            .usernameParameter("email")
            .passwordParameter("passwd")
            .permitAll()
            .and()
            //예외처리
            .exceptionHandling().accessDeniedHandler(MemberAccessDeniedHandler())
            .and()
            .rememberMe()
            .key("jpub")
            .rememberMeParameter("remember-me")
            .rememberMeCookieName("jpubcookie")
            .tokenValiditySeconds(86400) //1day
            .tokenRepository(rememberMeTokenService()).userDetailsService(myUserService())
            .and()
            //로그아웃
            .logout()
            .invalidateHttpSession(true)
            .clearAuthentication(true)
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .logoutSuccessUrl("/login?logout")
            .permitAll();
}
  • 각 설정마다 .and()로 연결한다.
  • antMatchers
    • 접근 제어를 하지 않을 경로들을 입력
    • 경로 전체에 적용하려면 '/**'를 사용
  • .headers().frameOptions().disable().and().csrf().ignoringAntMatchers("/h2-console/**")
    • Spring Security 사용 시 h2-console을 사용할 수 있도록 하는 설정
  • .formLogin() ~ .permitAll()
    • 로그인 설정

MemberService 작성

  • bCryptPasswordEncoder
    • Spring Security에서 제공하는 단방향 암호화 클래스
    • 이를 이용하여 DB에 저장하기 직전에 인코딩하여 저장한다.
  • token validation
    • Spring Security에서는 CSRF 공격방지를 위해서 token validation을 제공

토큰 사용

Remember Me

  • Remember Me
    • Spring Security에서 제공하는 기능
    • 인증 정보를 쿠키 형태로 보고나해서 만료 기간 전까지 저장된 쿠키 정보로 인증을 대신 처리해 주는 기능

'WebStudy > Spring' 카테고리의 다른 글

Spring Cache  (0) 2021.07.28
예외 처리 및 테스트  (0) 2021.07.24
Boot Starter  (0) 2021.07.22
Annotation  (0) 2021.07.21
REST API 2  (0) 2021.07.20
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기