@EnableWebSecurity : Spring Security 활성화
extends WebSecurityConfigurerAdapter : 보안 설정을 재정의할 수 있음
주요 설정 예시:
http.csrf().disable() // CSRF 토큰 검증 비활성화 (개발 초기에 주로 사용)
.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"); // 인증 안 된 사용자는 loginForm 페이지로 이동
이렇게 하면 user, manager, admin 경로는 각각 로그인 및 권한이 있어야 접근 가능하고, 나머지(예: index)는 누구나 접근 가능하다.
/login을 커스터마이징)JPA 기반 User 테이블
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
private String email;
private String role; // ROLE_USER, ROLE_ADMIN 등
@CreationTimestamp
private Timestamp createDate;
}
권한은 ROLE_ prefix를 붙이는 것이 Spring Security 규칙.
JpaRepository<User, Integer> 상속
기본 CRUD 사용 가능
public interface UserRepository extends JpaRepository<User, Integer> {}
비밀번호 암호화 필요 → BCryptPasswordEncoder 사용
@Bean 등록하여 IoC 컨테이너에 관리
@Bean
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
}
회원가입 시 비밀번호 암호화 후 저장
@PostMapping("/join")
public String join(User user) {
String rawPassword = user.getPassword();
String encPassword = bCryptPasswordEncoder.encode(rawPassword);
user.setPassword(encPassword);
user.setRole("ROLE_USER");
userRepository.save(user);
return "redirect:/loginForm"; // 회원가입 완료 후 로그인 페이지로 이동
}
중요: Spring Security는 로그인 시 입력된 패스워드를 DB에 저장된 암호화된 패스워드와 자동으로 비교하기 때문에, 반드시 BCryptPasswordEncoder로 인코딩해야 로그인 성공 가능.
/loginForm → 로그인 화면UsernamePasswordAuthenticationFilter가 동작하며, DB의 사용자 정보와 비교 후 인증 처리사용자 요청
/loginForm → 로그인 화면/joinForm → 회원가입 화면회원가입
BCryptPasswordEncoder로 암호화 후 DB 저장ROLE_USER로그인
/login POST 요청을 낚아채 인증 수행username, password와 입력값 비교접근 제어
user/** → 로그인 필요manager/** → ROLE_ADMIN, ROLE_MANAGER 필요admin/** → ROLE_ADMIN 필요Spring Security는 기본적으로 모든 요청을 차단하지만, SecurityConfig를 통해 인증/권한 정책을 설정할 수 있고, 회원가입 시 반드시 비밀번호를 암호화해야 로그인 인증이 정상적으로 동작한다.