Spring

Spring Security 스프링 시큐리티 정리

keembloo 2023. 10. 30. 10:28
728x90

 

 

스프링 시큐리티

 

로그인처리 , 자동 로그인 기능 처리 , 로그인 후에 페이지 이동 , 암호화 처리 도와주는 라이브러리이다.

개발자는 약간의 코드와 설정만으로 로그인 처리 할 수 있기 때문에 개발의 생산성을 높일 수 있다.

 


 

1. 시큐리티 설치

 

build.gradle 에 dependencies에 추가해준다.

 

implementation 'org.springframework.boot:spring-boot-starter-security' // Spring Security 라이브러리

 

 


2. 시큐리티 로그인

 

기본값 ID : user

기본값 PW : 매번 다르게 생성 ( console에서 확인)


인증(Authentication) 과 인가(Authorization)

인증 : 해당 사용자가 본인이 맞는지를 확인하는 절차. 즉 로그인
인가 : 인증된 사용자가 요청된 자원에 접근가능한가를 결정하는 절차 즉 권한설정

 

 

기존 웹은 아이디와 패스워드를 한번에 조회하지만 시큐리티는 2가지 과정을 거친다

1. 사용자의 아이디만으로 사용자의 정보를 로딩(정보불러옴)
2. 로딩된 사용자의 정보를 이용해서 패스워드를 검증

 

로그인하지 않아도 볼수 있도록 설정하고 싶다면 개발자가 직접 설정하는 코드가 반드시 필요하다.

 


 

스프링 시큐리티 커스텀하기

 

1. 시큐리티 커스텀할 클래스 선언 [ SpringSecurityConfig ]

 

2. @Configuration

 

3. extend WebSecurityConfigurerAdapter

 

4. 오버라이딩 [ 메소드 커스텀 ]

- configure(HttpSecurity http)

 

http.csrf().disable();

(시큐리티는 기본적으로 csrf 차단되어있다)

 

http.csrf().ignoringAntMatchers("/signup");

(특정 http에서만 csrf 사용안함)

 

-configure( AuthenticationManagerBuilder auth )


config 폴더에 클래스를 생성한다.

@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
    }
}

 

상속 받은뒤

생성 - 메서드 재정의를 하면 커스텀할 수 있다


인증 처리를 위한 UserDetailsService

 

실제로 인증을 처리하는 인터페이스 구현체이다.

그 인터페이스 안에는 loadUserByUsername 이라는 단 하나의 메소드를 가진다.

이것을 호출하여 실제 인증 처리를 할 수 있다.

 

*예시코드

@Service
public class MemberService implements UserDetailsService {

    // ------------------------------------------------------- //
        // 1. UserDetailsService 구현체
        // 2. 인증처리 해주는 메소드 구현 [ loadUserByUsername ]

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("username = " + username);;
        return null;
    }
}

 

UserDetails 반환타입


인증처리 해주는 메소드 구현 [ loadUserByUsername ]
loadUserByUsername 메소드는 무조건!!!!! UserDetails객체를 반환해야한다.
UserDetails 는 패스워드 검증과 사용자 권한을 확인하는 동작(메소드)

 

*예시코드

@Service
public class MemberService implements UserDetailsService {

    // ------------------------------------------------------- //
        // p.687
        // 1. UserDetailsService 구현체
        // 2. 인증처리 해주는 메소드 구현 [ loadUserByUsername ]
        // 3. loadUserByUsername 메소드는 무조건(꼭) UserDetails객체를 반환해야한다.
        // UserDetails 는 패스워드 검증과 사용자 권한을 확인하는 동작(메소드)
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("username = " + username);;
        
        // [예시] - 임의의 아이디와 패스워드 넣고 userDetails 객체 만들기
        UserDetails userDetails = User.builder()
                .username("asdf")   // 아이디
                .password("asdf")   // 패스워드
                .authorities("ROLE_USER")   // 인가 정보 
                .build();
        return userDetails;
    }
}

 

728x90