본문 바로가기

SpringBoot

[Springboot] #1 spring security와 jwt로 인증구현하기 - spring security 사용하기

로그인과 인증구현을 위해 spring security를 사용했다.

Spring Security란

Spring Security는 Java 기반의 프레임워크로서, 애플리케이션의 보안을 담당하는 강력한 보안 프레임워크이다.

spring security와 jwt의 통신과정

  1. 프론트엔드에서 사용자의 로그인 정보 (예: userId, userPw)를 백엔드로 전송한다.
  2. 백엔드는 받은 로그인 정보를 검증하고, 인증이 성공하면 해당 사용자의 정보로 JWT를 생성 후 프론트엔드로 반환한다.
  3. 프론트엔드는 받은 JWT를 저장하고, 이후 서버에 요청을 보낼 때마다 해당 JWT를 요청의 헤더에 포함시켜 보낸다.
  4. 백엔드는 요청을 받을 때 JWT를 검증 후 성공하면 요청에 대한 처리를 진행하고, 결과를 프론트엔드에 응답한다.

Spring Security

의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-security'

Spring Security 설정

검색 당시에는 spring security를 구성하기 위해 'WebSecurityConfigurerAdapter'를 상속받아 인증받는 설정을 작성하라 하였지만 어느 순간부터 deprecated 되어 사용할 수 없었다.

@EnableWebSecurity 어노테이션 추가

기본 설정( SecurityConfig.java)

@Configuration
@EnableWebSecurity
public class SecurityConfig{

    @Primary
    @Bean
    protected AuthenticationManagerBuilder configure(AuthenticationManagerBuilder auth) throws Exception {
        // 인메모리 사용자 생성
        auth.inMemoryAuthentication()
                .withUser("user1")
                .password(passwordEncoder().encode("password1"))
                .roles("USER");

        return auth;
    }
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
           .authorizeHttpRequests((request) -> 
                       request
                     .requestMatchers("/v3/api-docs/**", "/swagger-ui/**").permitAll()//해당경로 url은 인증없이 사용가능
                     .anyRequest().authenticated())
           .formLogin(formLogin->{
                    formLogin
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .defaultSuccessUrl("/test/get", true);
                });

        return http.build();
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

AuthenticationManagerBuilder를 이용하여 테스트용 인메모리 사용자를 만들었다. PasswordEncoder()를 사용하여 비밀번호 설정

SecurityFilterChain

authorizeHttpRequests() : HTTP 요청에 대한 인가 규칙을 구성
requestMatchers().permitAll() : 해당 경로에 대해 모든 사용자가 접근 가능하도록 해준다.
anyRequest().authenticated() : 앞서 설정한 경로를 제외한 모든 경로는 인증을 해야지만 접근이 가능하도록 하였다.

.requestMatchers("/admin/\*\*").hasRole(Role.ADMIN.name()) : admin이라는 역할을 가지고 있어야 해당 경로로 접근 가능

formLogin() : 로그인 폼 설정
.usernameParameter("username") ,.passwordParameter("password"): 로그인 폼에서 사용할 유저네임 파라미터명과 비밀번호 파라미터명 설정
.defaultSuccessUrl() : 로그인 성공시 이동할 경로

 

 

이후 실행 시 spring security에서 기본 제공해주는 로그인 폼이 나온다. 이때 테스트용으로 만들어준 사용자의 아이디와 비밀번호를 치면 로그인에 성공하면서 내가 설정해준 '/test/get' url로 이동하게된다.