새소식

반응형
Java/Spring Boot

Spring Security 정리하기 (#2 Form Login 구현)

  • -
728x90
반응형

Spring Security 에서 인증이 되지 않은 사용자는 다른 페이지로 이동을 시도할 경우 로그인 페이지로 

리다이렉트 됩니다.

 

사용자가 로그인 정보를 입력하고 로그인을 시도한다.

인증이 될 경우 Authentication 이라는 인증 토큰을 생성하고 해당 토큰을 Security Context 및 세션에

저장한다.

 

사용자가 요청을 하게 되면 Spring Security 는 세션에 저장된 인증토큰을 확인하여 

인증된 사용자라고 판단하여 요청에 대한 응답을 하게 된다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                    .authenticated()
        .and()
                .formLogin()
                        .loginPage("/login.html")
                        .defaultSuccessUrl("/home")
                        .failureUrl("/login.html")
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .loginProcessingUrl("/login")
                        .successHandler("로그인 성공 핸들러")
                        .failureHandler("로그인 실패 핸들러")
                        .permitAll();
    }
}

 

  •  .formLogin()
    • .loginPage(): 사용자정의로그인페이지
    • .defaultSuccessUrl(): 로그인성공후 이동페이지
    • .failureUrl(): 로그인실패시 이동페이지
    • .usernameParameter(): 아이디 파라미터 설정
    • .passwordParameter():패스워드파라미터 설정
    • .loginProcessingUrl(): 로그인Form action url
    • .successHandler(): 로그인 성공후 핸들러이벤트
    • .failureHandler() 로그인 실패 후 행들러
    • .permitAll(): 해당 로그인페이지는 모두접근할수 있도록 설정한다.

 

위 api 중 loginProcessingUrl() 을 살펴보자

실제로 form 태그의 action 을 통해 로그인을 진행할 URL 이다.

예를 들어 로그인을 진행할 form 태그가 있다고 하자

<form action="/login">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit" value="로그인">
</form>

위처럼 login을 진행할 loginProcessingUrl() 에는 Form 태그의 action url 과 동일하게 맞춰줘야한다.

또한 로그인 입력 태그의 name 과 usernameParameter(),

패스워드 입력 태그 name 속성과 passwordParameter() 도 동일해야 한다.

 

로그인 Form action 처리를 진행하는 loginProcessingUrl API는 UsernamepasswordAuthenticationFilter 클래스를 사용해

사용자 인증을 진행한다. 아래 내용을 확인하자.

출처 :&nbsp;https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0/unit/30315

사용자의 로그인 인증처리에 관한 내용이다.

 

1. 사용자의 인증요청이 온다.

 

2. 사용자 인증처리에 관한 필터인 UsernamePasswordAuthenticationFilter 가 인증 처리를 하게 된다.

 

3. 필터는 AntPathRequestMatcher 클래스를 사용해 인증 요청 url 이 맞는지 확인하고

아니면 chain.doFilter를 이용해 다음 필터로 넘어간다.

 

4. 요청 정보가 맞으면 사용자가 입력한 아이디 및 패스워드를 Authentication 객체를 생성하고 그 객체에 담는다.

     (생성한 Authentication 객체는 인증되지 않은 객체이다.)

 

5. 인증 객체를 사용하여 인증을 진행하는 클래스는 AuthenticationManager 클래스이다. 인증관리자이다.

 

6. AuthenticationManager 클래스는 내부적으로 여러가지의 AuthentcationProvider 클래스 타입을 가지고 있다.

    이러한 AuthenticationProvider 클래스 중 맞는 클래스를 찾아 위임한다. 실제로 인증을 담당하는 클래스는

    AuthenticationProvider 이다.

 

7. AuthenticationProvider 클래스에서는 사용자가 입력한 정보가 담긴 Authentication 객체의 아이디를 통해

DB에서 패스워드 및 권한을 불러온다. 불러온 정보와 사용자가 입력한 정보를 비교하여 인증을 진행한다.

인증이 성공하면 성공여부가 담긴 Authentication 인증객체를 생성해 리턴한다.

 

8. 인증된 객체는 Security Context 및 세션에 저장한다.

 

9. 인증 성공 핸들러인 SuccessHandler 를 실행하고 다음 로직이 수행된다.

 

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.