Spring Security 설정하는 법

오성민·2022년 10월 22일
0

spring

목록 보기
2/17
post-thumbnail

현재 포트폴리오를 준비(?)하고 백엔드와 스프링 기초를 잡기 위해서 커뮤니티를 만드는 도중에 큰 난관을 만났다.
커뮤니티로 한정짓지 않아도 여러 가지 시스템을 운영하면 인증과 인가 기능이 거의 필수라고 할 수 있다.
Spring 프레임워크에서 인증과 인가 기능을 구현할 때에 대표적으로 사용하는 것이 바로 이번에 포스팅을 하게 될 Spring Security 이다.
Java에 익숙하지 않아서인지 Spring을 이제 공부하기 시작해서 그런 것인지 거의 몇 일을 헤맸다. 다음부터는 이렇게 헤매지 않고 바로 구현하고, 더 깊게 공부할 수 있도록 기본적인 설정법을 정리해놓자.

Dependency

가장 처음으로는 의존성 주입이다. 이 의존성은 Java에 익숙하지 않아서 그런지 정말 귀찮고 어렵다..
(Maven은 최근에 거의 사용하지 않는 추세라고도 하고 이번에 Gradle을 사용해서 구현했기 때문에 Gradle에 관한 내용만 정리하고, 다음에 Maven을 사용하면 그 때 다시 포스팅을 하도록 하자)

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.security:spring-security-test'
    } 

위와 같이 두 가지를 추가하여 사용할 수 있다.

Annotation

이 내용은 Spring Security에 한정된 내용은 아니고 Spring Boot를 사용할 때에 반드시 알아야하는 내용이지만 조금 늦게 알아서 까먹지 않게 추가해서 넣어본다.

@SpringBootApplication

이 Annotation은 Spring Boot에 동작원리와도 관련된 내용이여서 굉장히 복잡한 내용이지만 동작원리와 관련된 내용을 추가하면 내용이 너무 길어질 것 같으니 다음에 포스팅하기로 하고 간단하게 정리해보자.
해당 Annotation은 중요한 annotation 3개를 포함한다.

  • @SpringBootConfiguration : 이름에서 알 수 있듯이 Spring Boot에서 필요한 환경 설정으로 자동으로 해준다.

  • @EnableAutoConfiguration : 사전에 정의한 라이브러리를 특정한 조건이 만족되면 Bean으로 등록해준다.

  • @ComponentScan : 프로젝트를 진행하다보면 많이 사용하는 annotation 중 @Component, @Service, @Repository 등을 스캔하여 Bean으로 등록해준다.

이러한 주요 Annotation을 포함하여 여러 가지를 포함하고 있어서 반드시 추가하여야한다.

@Configuration

이것을 사용한 Class는 설정 클라스라는 것을 프로그램에게 알려준다.
나는 아직 프로젝트 파일 구조를

이렇게 잡았다.
이러한 구조가 모든 요소를 생각했을 때 좋은 것인지는 모르겠지만 까먹지말고 반드시 Config Package에 생성하는 Class에는 해당 Annotation을 추가해주자.

@EnableWebSecurity

해당 Annotation은 이름에서도 알 수 있듯이 Web보안을 적용해주는 것 같다(?)

Methode

SecurityConfig Class에 가장 먼저 추가하는 메소드로는 설정 메소드이다.
해당 메소드는 SecurityFilterChain 라는 클래스를 resultType으로 설정하여 작성한다. parameterType은 HttpSecurity을 사용한 변수를 사용하여서 node.js에서도 본 chain에 형태로 여러 가지 설정을 해준다.
아래는 내가 간단하게 설정을 한 모습이다.

@Bean
    public SecurityFilterChain configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers("/user/test/{type}").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/logintest")
                    .loginProcessingUrl("/user/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll()
        ;
        return http.build();
    }

제발 까먹지말자..!

profile
풀스택을 지향하는 개발자

0개의 댓글