[Spring] Spring Security (1)

지인·2023년 6월 24일
0

Spring

목록 보기
6/20
post-custom-banner

[Spring] Spring Security (2)

🐰 Spring Security

  • Spring 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크이다.
  • 인증과 권한에 대한 부분은 filter의 흐름에 따라 처리하고 있다.
  • 많은 보안 관련 옵션들을 제공해주어 개발자가 보안 로직을 하나씩 작성하지 않아도 되는 장점이 있다.

추가

// Security
implementation 'org.springframework.boot:spring-boot-starter-security'

활성화

  • Spring Security 제외 해제
@SpringBootApplication
public class SpringAuthApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringAuthApplication.class, args);
	}
}

설정

package com.sparta.springauth.config;

import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // CSRF 설정
        http.csrf((csrf) -> csrf.disable());

        http.authorizeHttpRequests((authorizeHttpRequests) ->
                authorizeHttpRequests
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
                        .anyRequest().authenticated() // 그 외 모든 요청 인증처리
        );

        // 로그인 사용
        http.formLogin(Customizer.withDefaults());

        return http.build();
    }
}
  • CSRF(Cross Site Request Forgery)

    • 사용자의 의지와는 무관하게 공격자가 수정, 삭제, 등록 등을 특정 웹사이트에 요청하게 만드는 공격
    • CSRF 설정이 되어있는 경우 html 에서 CSRF 토큰 값을 넘겨주어야 요청을 수신 가능
    • 쿠키 기반의 취약점을 이용한 공격 이기 때문에 REST 방식의 API 에서는 disable 가능합니다.
    • POST 요청마다 처리해 주는 대신 CSRF protection 을 disable 해준다.
      http.csrf((csrf) -> csrf.disable());

🐰 Spring Security - 로그인

  • Client 의 요청은 모두 Spring Security 를 거치게된다.
  • Spring Security 역할
    • 인증/인가
      1. 성공 시: Controller 로 Client 요청 전달
        1. Client 요청 + 사용자 정보 (UserDetails)
      2. 실패 시: Controller 로 Client 요청 전달되지 않음
        1. Client 에게 Error Response 보냄

로그인 처리 과정

1. Client

  1. 로그인 시도
  2. 로그인 시도할 username, password 정보를 HTTP body 로 전달 (POST 요청)
  3. 로그인 시도 URL 은 WebSecurityConfig 클래스에서 변경 가능
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    // CSRF 설정
    http.csrf((csrf) -> csrf.disable());

    http.authorizeHttpRequests((authorizeHttpRequests) ->
            authorizeHttpRequests
                    .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
                    .anyRequest().authenticated() // 그 외 모든 요청 인증처리
    );

    // 로그인 사용
	 http.formLogin((formLogin) ->
            formLogin
                 // 로그인 처리 (POST /api/user/login)
                .loginProcessingUrl("/api/user/login").permitAll()
    );

    return http.build();
}

2. 인증 관리자 (Authentication Manager)

  1. UserDetailsService 에게 username 을 전달하고 회원상세 정보를 요청

3. UserDetailsService

  1. 회원 DB 에서 회원 조회
User user = userRepository.findByUsername(username)
        .orElseThrow(() -> new UsernameNotFoundException("Not Found " + username));
  • 회원 정보가 존재하지 않을 시 → Error 발생
  1. 조회된 회원 정보(user) 를 UserDetails 로 변환
UserDetails userDetails = new UserDetailsImpl(user)
  1. UserDetails 를 "인증 관리자"에게 전달

4. "인증 관리자" 가 인증 처리

  1. 아래 2 개의 username, password 일치 여부 확인
    • Client 가 로그인 시도한 username, password
    • UserDetailsService 가 전달해준 UserDetails 의 username, password
  2. password 비교 시
    • Client 가 보낸 password 는 평문이고, UserDetails 의 password 는 암호문
    • Client 가 보낸 password 를 암호화해서 비교
  3. 인증 성공 시 → 세션에 로그인 정보 저장
  4. 인증 실패 시 → Error 발생

참고

[Spring Security] Spring Security란?

profile
열쩡
post-custom-banner

0개의 댓글