[Spring Security] 기본 동작 개요

SeungWoo Cha·2025년 9월 22일

Spring_Security

목록 보기
1/4

Spring Security

1. Spring Security 기본 동작

  • 의존성 추가 시 기본 보안 정책
    Spring Security를 의존성에 추가하면 기본적으로 모든 요청이 차단되며, 서버의 모든 페이지 접근은 인증(로그인)이 필요하다.
    따라서 SecurityConfig를 커스터마이징해야 원하는 접근 정책을 설정할 수 있음.

2. SecurityConfig (보안 설정)

  • @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)는 누구나 접근 가능하다.


3. 회원가입 & 로그인 페이지

  • loginForm: 로그인 전 보여줄 화면 (기본 /login을 커스터마이징)
  • joinForm: 회원가입 폼
  • 사용자가 joinForm에서 입력한 데이터를 DB에 저장하여 회원 계정을 생성한다.

4. User 엔티티 설계

  • 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 규칙.


5. UserRepository 생성

  • JpaRepository<User, Integer> 상속

  • 기본 CRUD 사용 가능

    public interface UserRepository extends JpaRepository<User, Integer> {}

6. 회원가입 로직

  • 비밀번호 암호화 필요 → 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로 인코딩해야 로그인 성공 가능.


7. 로그인 처리

  • /loginForm → 로그인 화면
  • 로그인 요청은 Spring Security가 가로채서 처리함 (컨트롤러에서 직접 처리할 필요 없음)
  • UsernamePasswordAuthenticationFilter가 동작하며, DB의 사용자 정보와 비교 후 인증 처리

8. 정리된 흐름

  1. 사용자 요청

    • /loginForm → 로그인 화면
    • /joinForm → 회원가입 화면
  2. 회원가입

    • 비밀번호를 BCryptPasswordEncoder로 암호화 후 DB 저장
    • 권한은 기본적으로 ROLE_USER
  3. 로그인

    • Security가 /login POST 요청을 낚아채 인증 수행
    • DB의 username, password와 입력값 비교
  4. 접근 제어

    • user/** → 로그인 필요
    • manager/** → ROLE_ADMIN, ROLE_MANAGER 필요
    • admin/** → ROLE_ADMIN 필요
    • 나머지는 모두 접근 가능

Spring Security는 기본적으로 모든 요청을 차단하지만, SecurityConfig를 통해 인증/권한 정책을 설정할 수 있고, 회원가입 시 반드시 비밀번호를 암호화해야 로그인 인증이 정상적으로 동작한다.


profile
한 발자국씩

0개의 댓글