본문 바로가기

etc.

Spring Boot Security

1. 로그 레벨 설정

스프링 시큐리티 기본 설정에서 서버를 켜면 콘솔에 비밀번호가 출력된다.

  • ID: user
  • Using generated security password: 914ea598-3db6-42cf-9f37-e13366f991ae

localhost:8080 -> localhost:8080/login

로그인 화면에서 출력된 비밀번호를 입력해야 애플리케이션에 접근할 수 있다.

 

2. org.springframework.security.core.userdetails.User 를 상속받은 User 클래스 생성

Class SecurityUser extends User

이 클래스는 회원(Member)에 해당하는 도메인과 매칭된다.

생성자에서 부모 생성자를 호출하며 파라미터로 id, password, 권한 정보를 전달한다.

그리고 member 객체를 필드로 가지고 있어서 일종의 wrapping class가 된다.

 

3. org.springframework.security.core.userdetails.UserDetailsService 상속받은 Service 클래스 생성

Member 대신 UserDetail 을 반환한다.

org.springframework.security.core.userdetails 가 정의하는 Exception 들을 활용한다.

 

4. Spring Security Web MVC 설정 - SecurityConfig 클래스 생성

기존에 SecurityConfig 를 정의하기 위해 상속한 WebSecurityConfigurerAdapter 가 Deprecated 됨

 

SecurityFilterChain Bean 등록

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/", "/members/login").permitAll()
                .antMatchers("/manager/**").hasAnyRole("USER", "MANAGER")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login").defaultSuccessUrl("/main", true)
                .loginProcessingUrl("/loginAction").defaultSuccessUrl("/main", true)
                .and()
                .exceptionHandling().accessDeniedPage("/accessDenied")
                .and()
                .logout().logoutUrl("/logout").logoutSuccessUrl("/")
                .and()
                .userDetailsService(userDetailService)
                .build();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
    
}

 

filterChain(HttpSecurity http)

  • @EnableWebSecurity: 스프링 Security 설정 = Security 필터 등록
  • @Bean ...(HttpSecurity http) {} : HttpSecurityConfiguration이 HttpSecurity Bean을 주입해준다.
  • .antMatchers("/", "/members/login").permitAll() : 모든 사용자 접근 가능
  • .antMatchers("/manager/**").hasRole("USER", "MANAGER") : USER, MANAGER 권한을 가진 사용자 접근 가능
  • .anyRequest().authenticated() : 그 외 url 에 대한 요청은 모두 인증된 사용자만 접근 가능
  • .loginPage("/login").defaultSuccessUrl("/main", true) : 로그인 페이지, 로그인 성공 url 매칭. 미인증 상태에서 인증이 필요한 페이지 접근 시 로그인 페이지로 이동한다.
  • .loginProcessingUrl("/loginAction").defaultSuccessUrl("/main", true) : 로그인 액션 프로세스(POST), 액션 성공 url 매칭
  • .exceptionHandling().accessDeniedPage("/accessDenied") : 권한 없는 상용자 접근 시 url 매칭
  • .logout().logoutUrl("/logout").logoutSuccessUrl("/") : 로그아웃 url과 로그아웃 성공 url 매칭

formLogin 작동 방식

 

passwordEncoder() : 비밀번호 암호화(단방향)를 위한 등록. Member 객체를 생성할 때 이것을 의존관계 주입받아 직접 password를 encode 해야 한다.

 

5. 컨트롤러에서 Authentication(인증 정보) 주입 받기

@RequestMapping
public String main(Authentication authentication) {
    SecurityUser securityUser = authentication.getPrincipal(); //SecurityUser extends User
    ...
}

 

'etc.' 카테고리의 다른 글

[RestAPI] RESTful 웹 API 디자인  (0) 2023.01.31
[Intellij] 서블릿 프로젝트 생성  (0) 2023.01.30