본문 바로가기

Dev/Spring Boot

Spring Security - 로그인 처리 과정

728x90

스프링 시큐리티가 로그인 인증을 하는 로직은 다음과 같다.

 

 Http 요청이 들어오고 필터를 거처 마지막에 SecurityContextHolder에 들어간다. 세션에 들어갈 수 있는 오브젝트는 스프링 시큐리티에서 정해져있다. 

 

그것이 위의 있는 Authentication 이다. 이 안에는 유저 정보가 들어있고 유저 정보가 있는 오브젝트 타입은 UserDetail이다. 위 6번에서 알 수 있듯, UserDetatils는 인터페이스로 제공이 된다. 이제 저 인터페이스를 구현해보자

 

PrincipalDetails로 UserDetails 인터페이스를 구현한다.

 

이제 구현한 프린시펄디테일을 어떻게 세션에 넣는 걸까? 방법은 간단하다. 간편한 서비스가 이미 구현되어 있기 때문에 우린 그 인터페이스를 구현하여 사용하면 된다. 위에도 나와있는 UserDetailService 이다.

그런데 이런 의문이 든다. 아니... 로그인이 되면 얘네들이 자동으로 실행되는건가? 따로 설정하지 않아도? 정답은 그렇다이다. 스프링시큐리티가 간편한 이유다. 

.loginProcessingUrl("/login") // login 주소가 호출되면 시큐리티가 낚아채서 대신 로그인을 진행해준다.

스프링 시큐리티는 지장한 링크로 로그인 요청이 들어오면 자동으로 IoC에 등록된 위 서비스가 실행이된다. 자동으로 유저 네임까지 가져와 loadUserByUsername을 동작시킨다. 그리고 null이 아니면, 즉 있는 유저이면 프린시플디테일을 새로 만들어내고 이후 자동으로 세션에 투입되어 로그인이 완료된다.

 

*오류가 날 수 있는 요소 

 

// 만약 유저네임이 아니라 다르게 ex) ID 로 받으려면, usernameParameter("ID") 로 바꿔줘야함