Spring

Spring boot Security 사용법

JUNGKEUNG 2022. 11. 3. 00:54

Spring boot Security 사용법

 

개발 환경

  • java 11
  • gralde 2.7.3

 

build.gralde 에 Security 추가

더보기
implementation 'org.springframework.boot:spring-boot-starter-security'

 

 

Spring Security란?

Spring 기반의 애플리케이션의 보안(인증과 권한, 인가)을 담당하는 스프링 하위 프레임워크이다.

인증과 권한에 대한 부분을 Filter 흐름에 따라 처리하고 있다. Filter는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 URL 요청을 받지만, Interceptor는 Dispatcher와 Controller사이에 위치한다는 점에서 적용 시기의 차이가 있다. Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다

 

 

 

Spring Security 동작 과정

인증관련 architecture

 

 

인증, 인가, 보안 주체 이 3가지는 Spring Security를 공부하기에 앞서 보안 용어에 대해 숙지해야 한다.

 

 

 

인증(Authentication)

입증, 증명이라고도 한다

암호화 같은 자격 증명을 검증하여 사용자 ID를 확인하는 것이다

보통 이 인증은 사용자 이름(ID)와 암호(PW)로 수행된다

이증은 단일부터 2단계, 다중 인증까지 거칠 수 있다

 

 

 

인가(Authorization)

허가, 권한 부여라고도 한다

인증(Authentication) 이후에 발생하는 과정으로, 인증된 사용자에게 시스템 액세스 권한을 부여하는 과정이다

 

 

보안 주체(Principal)

Principal은 직역하면 '주된'이라고 해석된다

즉, 보안 시스템이 작동되고 있는 애플리케이션에 접근하는 유저(주체)를 말한다

 

 

 

 

Spring boot Security 코드

@Configuration
@EnableWebSecurity //웹보안 활성화를 위한 어노테이션
public class SecurityConfig extends WebSecurityConfigurerAdapter {

   private PrinaipalDetailService prinaipalDetailService;

   @Autowired
   public SecurityConfig(PrinaipalDetailService prinaipalDetailService) {
       this.prinaipalDetailService = prinaipalDetailService;
   }

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests() // 요청에 의한 보안 검사
                .anyRequest().authenticated() //어떤 요청에도 보안검사
                .and()
                .formLogin() // 보안 검증은 formLogin 방식으로 한다
                .loginPage("/member/login") //사용자 정의 로그인 페이지
                .defaultSuccessUrl("/board/list", true) //로그인 성공 후 이동 페이지
                .failureUrl("/member/login") // 로그인 실패 후 이동 페이지
                .usernameParameter("username") //아이디 파라미터명 설정
                .passwordParameter("password") //패스워드 파라미터명 설정
                .permitAll() //사용자 정의 로그인 페이지 접근 권한 승인
                .and()
                .logout() //로그아웃
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) //지정하고 싶은 로그아웃 url
                .logoutSuccessUrl("/login"); //로그아웃 성공 시 이동 페이지

    }
}

 

 

코드 하나하나 알아보도록 하겠다

public class SecurityConfig extends WebSecurityConfigurerAdapter

WebSecurityConfigurerAdapter

  • WebSecurity와 HttpSecurity 모두 사용자가 원하는 대로 맞춤 변경할 수 있도록 하는 편리한 클래스이다.
  • 개별 객체에서 여러 번 확장해, 여러 http요소를 갖는 작업을 여러번 할 수 있다

 

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

 

 

PasswordEncoder 

PasswordEncoder 인터페이스를 구현한 클래스이다.

생성자의 인자 값(version, strength, SecureRandom instance)을 통해서 해시의 강도를 조절할 수 있다

 

 

BCryptPasswordEncoder 

BCrypt 해싱 함수(BCrypt hashing function)를 사용해서 비밀번호를 인코딩해주는 메서드와 사용자의 의해 제출된 비밀번호와 저장소에 저장되어 있는 비밀번호의 일치 여부를 확인해주는 메서드를 제공한다.

 

 

BCryptPasswordEncoder는 위에서 언급했듯이 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 제공한다. 기본적으로 웹 개발함에 있어서 사용자의 비밀번호를 데이터베이스에 저장하게 된다. 허가되지 않은 사용자가 접근하지 못하도록 기본적인 보안이 되어 있을 것이다. 하지만 기본적 보안이 되어 있더라도, 만약 그 보안이 뚫리게 된다면 비밀번호 데이터는 무방비하게  노출이 된다. 이런 경우를 대비해 BCryptPasswordEncoder에서 제공하는 메서드를 활용하여 비밀번호를 암호화 함으로써 비밀번호 데이터가 노출되더라도 확인하기 어렵도록 만들어 줄 수가 있다.

 

 

 

참고


https://medium.com/lucky-sonnie/spring-security-websecurityconfigureradapter%EB%9E%80-6ae8e4baef7a

https://doozi0316.tistory.com

https://mangkyu.tistory.com/76

'Spring' 카테고리의 다른 글

Spring Boot 와 JPA 활용  (0) 2023.06.26
프록시 패턴과 프록시 서버  (0) 2022.12.16
고급 매핑 - 상속관계 매핑, @MappedSuperclass  (0) 2022.11.01
연관관계 매핑 고려사항 3가지  (0) 2022.10.25
연관관계 매핑 기초  (1) 2022.10.19