시큐리티 구현

사과농장주·2026년 3월 18일

자바스프링

목록 보기
3/8

실습

실습준비

  • pom.xml 의존성 추가
  • 파일 준비

CSRF(Cross-Site Request Forgery)

  • 공격자가 사용자의 브라우저를 악용하여 인증된 세션을 가진 사용자의 권한으로 악성 요청을 보내는 공격이다.
  • 스프링 시큐리티는 기본적으로 CSRF 보호를 활성화하여 GET 요청 외의 POST, PUT, DELETE 등의 요청에서 CSRF 토큰을 검증한다.

인증 활성화 / 비활성화

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {

        httpSecurity
                // .csrf(AbstractHttpConfigurer::disable) // CSRF 비활성화
                .csrf(Customizer.withDefaults()) // CSRF 기본 설정 사용
                .httpBasic(Customizer.withDefaults()) // HTTP 인증 활성화
                .formLogin(Customizer.withDefaults()) // 폼 로그인 활성화
                // 접근 제어 설정 (모든 요청에는 인증이 되어야만 요청 처리)
                .authorizeHttpRequests(authorizationRequests ->
                        authorizationRequests.anyRequest().authenticated()
                );


        return httpSecurity.build();
    }


csrf 활성화


csrf 비활성화


UserDetails Service

인증된 사용자 찾기
전달 받은 정보를 통해 사용자를 찾아 Userdetails 객체를 생성 후 반환한다.
userdetail service 암호가져와서 AuthenticationProvider가 비교

    @Bean
   public UserDetailsService userDetailsService() {
       // 인 메모리 방식 설정 (테스트 용도로 사용 메모리가 휘발성이라 실제 서비스에서 사용 불가)
       UserDetails user = User.builder()
               .username("user")
               // 패스워드 사용 시 암호화 안하고 그냥 한다
               .password("{noop}1234")
               .roles("USER")
               .build();

       UserDetails admin = User.builder()
               .username("admin")
               .password("{noop}5678")
               .roles("ADMIN")
               .build();

       return new InMemoryUserDetailsManager(user);

   }
}


로그인 페이지 커스텀

  • 세션 기반 로그인 (세션 나가면 자동 로그아웃)

// login 경로에 대한 요청은 누구나 허용
.requestMatchers("/login").permitAll()
// 그 외 모든 요청은 인증 필요
.anyRequest().authenticated()


작고 소중한 한 없이 작은 로그인 페이지 완성


로그인 유지

  • 인증 정보는 세션에 있으나 리멤버 어쩌고에 토큰이 만들어져 있다.
  • key remember-me 쿠키를 검증할 때 사용할 서명용 키
  • tokenValiditySeconds(1209600) 쿠키 유효기간 초 단위 설정
httpSecurity

	// 기억하기 기능
	.rememberMe(rememberMe -> rememberMe
		.key("beyond") // 쿠키의 값을 암호화 하는 키 값을 설정
        .tokenValiditySeconds(1209600) // 쿠키의 유효시간을 지정(초)
);

1. JSESSIONID

  • 서버 세션을 식별하는 기본 쿠키 -> 현재 브라우저 세션
  • 일반 로그인 세션용

2. remember-me

  • 로그인 유지용 쿠키
  • 브라우저를 닫았다 다시 열어도 일정 기간 자동 인증을 도와준다.


다른 브라우저 로그인 시 기존 브라우저 자동 로그아웃


loadUserByUsername

UserDetailsService

  • 전달받은 username을 통해 데이터베이스에서 일치하는 사용자를 찾아 UserDetails 객체를 생성하고 반환한다.

UserDetails

  • 사용자의 정보와 권한 정보 등을 담고 있는 객체이다.

PasswordEncoder

매번 랜덤한 솔트 값을 가지고 암호화하기 때문에 매번 다른 값으로 암호화한다.

@Slf4j
@Controller
public class AuthController {
    @Autowired
    private PasswordEncoder passwordEncoder;

    @GetMapping("/login")
    public ModelAndView login(ModelAndView modelAndView) {

        System.out.println(passwordEncoder.encode("1234"));
        System.out.println(passwordEncoder.encode("5678"));

        log.info("로그인 페이지 요청");
        modelAndView.setViewName("auth/login");

        return modelAndView;
    }
  • 매번 다르게 암호화 되는 것을 알 수 있다.

암호 매칭

  • matches() 메소드를 사용하면 솔트 값을 뺀 나머지 값과 원문을 비교한다.

Authentication





profile
안녕, 나는 코딩 밭에서 사과를 줍는 사과농장주야 🍎

0개의 댓글