springframework/시작하자SpringSecurity

16.Authentication

Jungsoomin :) 2020. 9. 21. 16:51

인증, Authentication

 

  • 스스로 누구인지 증명하는 것이다.

  • Authentication 객체는 사용자의 인증 정보를 담는 Token 개념이다. (UsernameAuthenticationToken , AnonymousAuthenticationToken , RememberMeAuthenticationToken...)

  • 인증 시의 id , password를 담아 인증 검증을 위해 전달되어 사용된다.

  • 인증 후 최종 Authentication 객체에는 사용자 정보를 담은 User 객체권한정보인 Authority가 들어있다.

  • Authentication 객체는 SecurityContext에 저장되어 전역적으로 참조가 가능

  • Authentication authentication = SecurityContextHolder.getContext().getAuthentication()


Authentication 객체의 구조 와 속성

 

  • principal : Object 타입, 사용자 아이디 or User 객체 저장

  • credentials : 사용자 암호

  • authorities : 사용자의 권한 목록

  • details : 인증 부가 정보, 활용할 데이터를 담는다.

  • Authenticated : 인증 여부


인증시 활용과 변화과정

 

  1. 사용자Login : username , password 전달

  2. UsernamePasswordAuthentiationFilter 가 정보를 받아 Authentication 객체를 생성

  3. principal 속성에 username , credential 속성에 password 를 저장

  4. AuthenticationManagerAuthentication 객체를 가지고 인증처리 시작

  5. 인증 성공AuthenticationManagerAuthentication 구현체를 생성, principal 속성에 인증에 성공한 유저정보UserDetails 를 저장,  Credential은 보안상 비우기도 함, Authorities 속성에 권한정보를 담고 Authenticated 속성은 true 가 됨

  6. 최종 Authentication 객체SecurityContextHolderSecurityContext에 저장되어 전역적으로 사용


Authentication 객체를 구현하여 원하는 정보를 담을 수 도 있으며 , Authentication 객체를 꺼내어 정보를 가져올 수도 있다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                .authenticated();

        http
                .formLogin()
                .successHandler(new AuthenticationSuccessHandler() {
                    @Override
                    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                        Authentication authentication1 = SecurityContextHolder.getContext().getAuthentication();
                        authentication.getName();
                        authentication.getCredentials();
                        authentication.getAuthorities();
                        authentication.getDetails();
                        authentication.getPrincipal();
                    }
                });
    }
}