BACK-END/Spring Security

[Spring Security] 로그인

bameh 2022. 9. 26. 22:07

Spring Security 설정을 위한 SecurityConfig.java를 생성한다.

# 코드 전문

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)  // 특정 주소 접근 시 권한/인증 체크
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/css/**", "/js/**", "/assets/**", "/font/**", "/stadiumImg/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()           // csrf토큰 비활성화(csrf토큰이 있어야 접근 가능)
                .authorizeRequests()    // 인가 요청이 오면
                    .antMatchers(   // 해당 경로는
                           "/", "/main", "/signup", "/login", "/stadium", "/team", "/checkEmail"  
                            , "/landers", "/landers/"
                            , "/heroes", "/heroes/"
                            , "/twins", "/twins/"
                            , "/wiz", "/wiz/"
                            , "/tigers", "/tigers/"
                            , "/bears", "/bears/"
                            , "/giants", "/giants/"
                            , "/dinos", "/dinos/"
                            , "/lions", "/lions/"
                            , "/eagles", "/eagles/"
                    )
                    .permitAll()        // 접근을 허용
                    .anyRequest()       // 이외의 요청은
                    .authenticated()    //인증이 되야 들어갈 수 있다.
                .and()
                    .formLogin()
                    .loginPage("/login")     //로그인 페이지를 우리가 만든 페이지로 등록한다.
                    .loginProcessingUrl("/login")   //스프링 시큐리티가 해당 주소로 요청오는 로그인을 가로채서 대신 로그인해줌(서비스의 loadUserByName로 알아서)
                    .defaultSuccessUrl("/")        //정상일 때

            // 로그아웃
            .and().logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/");

        //중복 로그인
        http.sessionManagement()
            .maximumSessions(1)                 //세션 최대 허용 수
            .maxSessionsPreventsLogin(false);   // false이면 중복 로그인하면 이전 로그인이 풀린다.
    }
}

 

 

1. 인증 없이 접근 허용할 경로 설정 

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**", "/js/**", "/assets/**", "/font/**", "/stadiumImg/**");
}

- 인증을 무시할 경로를 설정한다.

- antMatchers()에 경로를 작성하지 않으면 비로그인시 해당 경로에 접근할 수 없다. 그렇기 때문에 기본적인 css, js, font, img를 반드시 접근 가능하도록 설정해야 한다.

 

 

2. Http 관련한 인증 설정

protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()           // csrf토큰 비활성화(csrf토큰이 있어야 접근 가능)
            .authorizeRequests()    // 인가 요청이 오면
                .antMatchers(  		// 해당 경로는
                       "/", "/main", "/signup", "/login", "/stadium", "/team", "/checkEmail"  
                        , "/landers", "/landers/"
                        , "/heroes", "/heroes/"
                        , "/twins", "/twins/"
                        , "/wiz", "/wiz/"
                        , "/tigers", "/tigers/"
                        , "/bears", "/bears/"
                        , "/giants", "/giants/"
                        , "/dinos", "/dinos/"
                        , "/lions", "/lions/"
                        , "/eagles", "/eagles/"
                )
                .permitAll()        // 접근을 허용
                .anyRequest()       // 이외의 요청은
                .authenticated()    // 인증이 되야 들어갈 수 있다.
            .and()
                .formLogin()
                .loginPage("/login")     		//로그인 페이지를 우리가 만든 페이지로 등록한다.
                .loginProcessingUrl("/login")   //스프링 시큐리티가 해당 주소로 요청오는 로그인을 가로채서 대신 로그인해줌(서비스의 loadUserByName로 알아서)
                .defaultSuccessUrl("/")       	//정상일떄

        // 로그아웃
        .and().logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/");

    //중복 로그인
    http.sessionManagement()
        .maximumSessions(1)                 //세션 최대 허용 수
        .maxSessionsPreventsLogin(false);   // false이면 중복 로그인하면 이전 로그인이 풀린다.
}

authorizeRequests()

- URL별 권한 관리를 설정한다.

- 이어서 antMatchers()를 이용하여 인증없이 접근이 가능한 URL을 설정한다.

antMatchers()

- 권한 관리 대상을 지정한다.

- URL 또는 HTTP 메소드 별로 관리가 가능하다.

permitAll()

- 앞에 선언한 URL은 누구나 접근이 가능하다.

hasRole()

- 앞에 선언한 URL은 해당 권한이 있어야 접근 가능하다.

anyRequest()

- 앞에 선언한 URL 이외의 주소들을 의미한다.

authenticated()

- 권한이 있으면 접근 가능하다.

 

formLogin()

- 로그인을 설정한다.

loginPage()

- 로그인 페이지를 설정한다.

loginProcessingUrl()

- Spring Security가 해당 주소로 요청오는 로그인을 가로채서 대신 로그인처리한다.

defaultSuccessUrl()

- 로그인에 성공하면 설정한 URL로 이동한다.

 

logout()

- 로그아웃을 설정한다.

logoutSuccessUrl()

- 로그아웃에 성공하면 설정한 URL로 이동한다.

 

sessionManagement()

- 세션 관련 내용을 설정한다.

maximunSession()

- 최대 허용 가능한 세션 수를 설정한다. 무제한일 경우 -1을 입력한다.

maxSessionsPreventsLogin()

- true: 중복으로 로그인을 진행했을 때 신규 로그인 사용자의 인증을 실패시킨다.

- false: 중복으로 로그인을 진행했을 때 이전 로그인 사용자의 세션을 만료시킨다.

 

 

3. Controller에서 login 클래스를 생성한다.

@GetMapping("/login")
public String login(HttpServletRequest request, Model model){
    return "common/login";
}

앞에서 SecurityConfig의 loginProcessiongUrl에 로그인 주소를 입력해주었다.

따라서 사용자가 로그인을 시도하기 위해 Controller에 접근하면 Security에서 자동으로 로그인 처리를 진행해준다.