#07 중요 로직들 - 3 (feat. passwordEncoder, configure)

김대진·2023년 3월 21일
0

Sekkison Project

목록 보기
8/22
post-thumbnail

SecurityConfig

BCryptPasswordEncoder

Sekkison 유저의 비밀번호를 안전하게 저장하기위해 BCryptPasswordEncoder를 사용해서 암호화를 진행하기로 하였다.

BCryptPasswordEncoder
Spring Seurity에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 가진 클래스

  1. 먼저 spring-boot-starter-securitybuild.gradle에 추가한다.

build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
}
  1. SecurityConfig 클래스에 BCryptPasswordEncoderbean으로 등록한다.
    ( SecurityConfig.Classconfig폴더 아래에 만들었다. )
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	@Bean
	public BCryptPasswordEncoder bCryptPasswordEncoder() {
		return new BCryptPasswordEncoder();
	}
}

이제 passwordEncoder를 사용할 수 있다.

String str = "1234"
String encodeStr = bCryptPasswordEncoder.encode(str);
System.out.println(encodeStr);

을 실행시켜 보면 인코딩된 문자열을 볼 수 있을 것이다.

우리 프로젝트에서는 UserService의 회원가입 로직에 추가해 사용하였다.

user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
userRepository.save(user);
Authority authmember = authorityRepository.findByAuth("MEMBER");
UserAuthority ua = UserAuthority.builder()
		.userId(user.getId())
		.authority(authmember.getId())
		.build();
userAuthorityRepository.save(ua);

저장된 데이터를 확인해 보면 다음과 같이 인코딩된 비밀번호를 확인할 수 있다.

configure

만약, API 서버로 스프링 프로젝트를 제작한다면, 서버에 데이터를 요청했을 때 만들지도 않은 로그인 페이지가 뜨는 경우가 있다.

이 경우 Security Config 클래스에 configure 함수를 추가하면 해결이 될 것이다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    // CSRF 비활성화
    http.csrf().disable();

    // 인증 설정
    http
    	.authorizeRequests()
  		// "/test/**" 로 들어오는 요청은 '인증'만 필요.
    	.antMatchers("/test/**").authenticated()
    	// /admin/** 주소로 들어오는 요청은 '인증' + ADMIN 권한 필요
    	.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
    	// 그 외에는 모두 접근 가능
    	.anyRequest().permitAll()
}

이제 test/.., /admin/.. 주소의 요청만 로그인 페이지로 이동하고,
/admin/.. 페이지에서는 admin권한도 같이 필요할 것이다.

그리고 그 외의 주소의 요청은 모두 로그인이 필요없기 때문에 기본 로그인 페이지로 이동하지 않는다.

참고로, SecurityConfig.class의 전문이다.

// 스프링 시큐리티 설정
@Configuration // 스프링컨테이너에 빈으로 생성
@EnableWebSecurity // WebSecurity 를 활성화
public class SecurityConfig extends WebSecurityConfigurerAdapter{
    // BCryptPasswordEncoder 를 bean 으로 등록
	@Bean
	public BCryptPasswordEncoder bCryptPasswordEncoder() {
		return new BCryptPasswordEncoder();
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		// CSRF 비활성화
		http.csrf().disable();

		// 인증 설정
		http
			.authorizeRequests()
			// "/test/**" 로 들어오는 요청은 '인증'만 필요.
			.antMatchers("/test/**").authenticated()
			// /admin/** 주소로 들어오는 요청은 '인증' + ADMIN 권한 필요
			.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
			// 그 외에는 모두 접근 가능
			.anyRequest().permitAll()
	}
}
profile
만재 개발자

0개의 댓글