인증과 권한 [2] security 동작 구조

최준호·2022년 3월 5일
0

Microservice Architecture

목록 보기
16/32
post-thumbnail

지난 포스트에서 security를 설정하고 이메일과 비밀번호로 인증이 되는것 까진 확인을 했다. 하지만 security가 모두 자동으로 처리하는 탓에 어떻게 돌아가는지 정확한 구조를 확인하지 못했다. 그래서 이번에는 디버그 모드로 실행하여 break point를 찍어서 동작을 확인해보자.

제 글을 따라오셨다면 서비스 재 실행시 데이터가 모두 소멸되기 때문에 회원 등록부터 다시 진행해주세요!

📃디버그 Break Point 찍기

AuthenticationFilter 파일에서 두개의 브레이크 포인트를 찍었다. attemptAuthentication 인증 요청시 요청이 되는지, successfulAuthentication 로그인 성공시 로그가 찍히는지 확인을 위해서 찍었다.

UserServiceImpl에서 loadUserByUsername에도 찍어놨다. 인증 요청 성공시 데이터를 가져오는데 이 로직을 통해서 가져오는지 확인을 위해 찍었다.

👏실제 디버그 확인

postman을 통해 login을 실행하면

인증 요청

가장 먼저 인증 요청 부분인 AuthenticationFilterattemptAuthentication로 실행이 된다. 동작 순서를 살펴보면 가장 먼저 읽어온 request를 통해 RequestLogin 객체를 만들고 해당 객체를 UsernamePasswordAuthenticationToken를 통해 token값으로 변경하여 전달한다.

정상적으로 로그인 성공 시 UserServiceImplloadUserByUsername를 실행하여 실제 유저가 존재하는지 확인을 한번 더 하고 User 객체를 반환한다.

그 후 AuthenticationFiltersuccessfulAuthentication이 실행되며 로그가 찍히고 종료되는데 성공 후에 우리는 jwt를 발급하도록 변경해 보려고 한다.

👎아이디를 틀리게 적은 경우


다음과 같이 아이디를 틀리게 적었을 때

인증 실행

security에서 제공하는 AbstractUserDetailsAuthenticationProviderauthenticate 메서드에서 인증 절차가 실행되는데 retrieveUser 메서드를 통해 제공받은 userName의 값과 토큰 값을 전달한다.

그럼 아이디 값을 통해 UserService에서 검색해보고 당연히 id가 존재하지 않기 때문에 Exception이 발생한다.

이럼 이전에 실행했던 retrieveUser의 catch에 걸리게 되고 var4로 정의된 UsernameNotFoundException Exception으로 던진다.

authenticate에서도 catch에 걸리게 되고 debug로 로그를 찍고 BadCredentialsException Exception을 생성하여

그후에는 AuthenticationExceptionProviderManagerauthenticate 메서드에서 던지게 된다. 그리고 계속 filter를 타고 처리가 되어지는데


결국 마지막엔 401 코드 Unauthorized를 보게 되는 것이다.

👎비밀번호를 틀리게 적은 경우

이번엔 비밀번호를 틀리게 적어보자

인증 실행

여기까진 동일하게 진행되며

이번엔 아이디가 존재하기 때문에 User 객체를 정상적으로 반환하게 된다.

그 때문에 loadedUser에도 null이 아닌 값이 들어가 있고

정상적으로 계속 진행된다.

하지만 additionalAuthenticationChecks 이 메서드를 진행할 때

security에서 제공하는 DaoAuthenticationProvideradditionalAuthenticationChecks에서 다음과 같이 비밀번호를 복호화하여 실제 user 객체에 담긴 비밀번호와 같은지 확인 작업을 진행하게 되고 당연히 비밀번호가 틀리기 때문에 debug 로그를 찍고 BadCredentialsException Exception을 발생시킨다.

그렇기 때문에 catch에서 AuthenticationException Exception으로 던져지며 이후 똑같은 처리가 진행된다.

그리고 401을 똑같이 확인할 수 있다.

Security를 깊게 뜯어본건 아니지만 로그인에서 security가 어떻게 자동으로 아이디 체크와 비밀번호 체크를 하는지 이해할 수 있었다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글