개발/JAVA

Java - Spring Boot의Security를 알아보자

외노자개발 2022. 11. 1. 19:15
반응형

 

해결 방법


Spring Security를 ​​사용하면 아무 것도 설정하지 않은 상태에서 모든 화면에 액세스하려면 인증이 필요합니다.
로그인 없이 액세스할 수 있도록 하려면 다음과 같이 하십시오.

보안 설정 클래스로 WebSecurityConfigurerAdapter 클래스를 상속하고 EnableWebSecurity 어노테이션이 추가된 클래스를 만듭니다.
void configure(HttpSecurity http)메소드를 오버라이드(override) 해, 이하와 같이 인증 불필요한 화면 (URL)을 지정합니다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Bean
	public BCryptPasswordEncoder encodePwd() {
		return new BCryptPasswordEncoder();
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.csrf().disable();
		http.authorizeRequests()
			.antMatchers("/user/**").authenticated()
			.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
			.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
			.anyRequest().permitAll()
			.and()
			.formLogin()
			.loginPage("/loginForm")
			.loginProcessingUrl("/login")  // /login 주소가 호출이 되면 시큐리티가 낚아채서 대신 로그인을 해준다.
			.defaultSuccessUrl("/");
}

위와 같이 설정하는 것으로 로그인 화면을 내가 설정 할 수 있다. 

user와 manager, admin 등의 권한을 설정할 수 가 있다.

 

  • BCryptPasswordEncoder
    • 패스워드의 해쉬코드화 시켜준다. 
  • antMatchers("/manager/**") ← 관리자 화면
    • 여기에 "ADMIN","MANAGER" 권한이 없으면 액세스 할 수 없습니다.
    • User 테이블의 role 컬럼에 들어 있는 "ROLE_ADMIN"의 "ROLE_" 부분을 제거한 것으로 인증됩니다.
  • antMatchers("/admin/**") ← 관리자 화면
    • 여기에 "ADMIN" 권한이 없으면 액세스 할 수 없습니다.
    • User 테이블의 role 컬럼에 들어 있는 "ROLE_ADMIN"의 "ROLE_" 부분을 제거한 것으로 인증됩니다.
  • .anyRequest().permitAll()
    • 모든 URL 요청은 액세스할 수 있다는 설명입니다.
  • .formLogin()
    • login이 되어 있지 않으면 loginPage("/login");으로 이동한다는 설명입니다. 

 

Spring Security의 작동 방식 개요


Spring Security는 서블릿의 필터 메커니즘을 활용하여 보안 기능을 구현합니다. 특정 경로와 일치하는 요청에 대해 인증을 요청하거나 반대로 정적 리소스와 같은 특정 경로와 일치하는 요청은 제한하지 않을 수 있습니다.

 

보안 필터의 입구가 되는 DelegatingFilterProxy것은, 최초로 springSecurityFilterChain라고 하는 Bean에 처리를 위양합니다. springSecurityFilterChain은 보안 필터 체인을 구축 FilterChainProxy하는 필터를 호출자에게 반환합니다. 그리고, 첫회 이후, DelegatingFilterProxy는 이를 FilterChainProxydelegator로 해 보관 유지해, FilterChainProxy에 처리를 위양하게 되어 있습니다.

 

 

Spring Boot로 자동 설정


앞에서 설명한 것처럼 spring-boot-security-starter패키지 종속성을 빌드 정의에 추가하기만 하면 Spring Boot의 Autoconfiguration 기능이 Spring Security 기능을 자동으로 설정합니다. 이것은 DI 컨테이너의 힘 때문입니다.

 

Spring Security에서는 @EnableWebSecurity보안 기능을 활성화했지만 Spring Boot에서는 필요하지 않다.  spring-boot-autoconfigure포함된 WebSecurityEnablerConfiguration클래스가 정의를 해주고 있습니다. 그러므로, 어플리케이션 개발자로서는, WebSecurityConfigurerAdapter을 계승한 클래스를 작성해, 시큐리티 필터의 설정을 하면 좋을 것 같습니다.

 

WebSecurityConfigurerAdapter를 상속한 SecurityConfig클래스를 생성하여 

configure(HttpSecurity http)메서드를 override하며 설정해야합니다.

 

@EnableWebSecurity란?

위의 SecurityConfig에 붙은 @EnableWebSecurity을 보면 WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class, HttpSecurityConfiguration.class들을 import해서 실행시켜주는 것을 알 수 있습니다. 해당 annotation을 붙여야지 Securiry를 활성화 시킬 수 있습니다.

 

 

@Configuration란?

@Configuration이라고 하면 설정파일을 만들기 위한 애노테이션 or Bean을 등록하기 위한 애노테이션이다.

 

회원가입 기능


	@PostMapping("/join")
	public String join(User user) {
		System.out.println(user);
		user.setRole("ROLE_USER");
		String rawPassword = user.getPassword();
		String encPassword = bCryptPasswordEncoder.encode(rawPassword);
		user.setPassword(encPassword);
		userRepository.save(user);
		return "redirect:/loginForm";
	}

 

bCryptPasswordEncoder는 패스워드를 해쉬코드화 해서 안전하게 해준다.

rawPassword에 user.getPassword(); 패스워드를 저장하고

encPassword에 bCryptPasswordEncoder.encode(rawPassword);로 해쉬코드화 해서 

그렇게 userRepository.save(user)를 함으로써 저장

반응형