[Security] 시큐리티 프로젝트 로그인 - 회원가입 및 기본로그인
https://oneseok.tistory.com/62
[Security] 시큐리티 프로젝트 로그인 - Security 설정 클래스 파일 생성
https://oneseok.tistory.com/61 [Security] 시큐리티 프로젝트 로그인 - 생성 및 프로젝트 설정 이번에 프로젝트 스프링 시큐리티를 이용하여 로그인 처리를 연습해보는 프로젝트를 만들어보려고한다. 최
oneseok.tistory.com
저번 시간에는 ecurity 설정과 로그인 , 회원가입에 필요한 설정들을 일부 하였다.
이번 시간에는 회원가입과 시큐리티 설정으로 로그인이 어떻게 이루어지는지 확인해 볼 것이다.
시큐리티 인증처리는 Session 영역 안에 Security session 세션이 생성되는데
("Security ContextHolder" , Authentication 객체) 형태로 Key:Value 형태로 생성되어 저장된다.
여기서 value 부분은 꼭 Authentication 타입 이여야한다!! 그리고 Authentication 객체로 인증 처리를 한다.
이 Authentication 안에 최종적으로 user의 정보가 들어있는데 이때 들어가는 user정보 객체는 꼭 "UserDetails" 타입이어야 한다.
그리고 "UserDetails" 타입 객체안에 우리가 만든 "User" 객체가 들어있다.
그림으로 확인하자면
Session - Security session - Authentication - UserDetails - User 형태를 갖고 있다
1. SecurityConfig에서 로그인 관련 설정하기
- 인증이 필요할 경우 로그인 페이지로 이동과 로그인 처리 및 로그인 이후 처리에 대한 설정이다.
.loginPage("/loginForm")
해당 설정은 로그인이 필요한 페이지일 경우 즉, 인증이 필요한 페이지 접근 시 이동되는 url을 설정하는 것이다.
로그인을 안한상태로 /user , /manager , /admin 페이지 접근시 발생한다.
.loginProcessingUrl("/login")
로그인 처리를 위한 url 설정이다.
여기서 신기한 점은 내가 Controller에 매핑되는 메소드를 만들지 않아도 Security가 알아서 처리해준다.
로그인 시 시큐리티가 요청을 낚아채서 내가 만든 "UserDetailsService" 타입의 "PrincipalDetailsService" 클래스에서 로그인 처리 진행한다.
그러기 위해서 "PrincipalDetailsService" 클래스 를 만들어야한다!!...(이따 뒤에서 만들것임)
.defaultSuccessUrl("/")
로그인 이후 어느 url로 이동할지 설정하는 것이다.
만약에 로그인이 필요한 특정 url로 이동한 상태에서 로그인 페이지로 왔다면 로그인 이후 바로 원래 가려했던 url로 이동해준다!!
예를들어 /user 페이지 접근하다 로그인이 안되서 로그인 페이지로 왔다면 로그인 이후에는 바로 /user url로 이동한다.
일반 스프링에서는 interceptor에서 이러한 처리를 해줬던 걸로 기억한다 , 시큐리티를 사용하면 이런 복잡한 로직 없이 바로 적용할 수 있는 장점이 있다.
2. UserDetails 타입의 클래스 만들기
- 먼저 UserDetails 인터페이스를 구현할 클래스를 만들자
- Authentication 객체 안에 들어갈 객체를 위한 클래스이다.
- PrincipalDetails 클래스가 UserDetails 타입이여야 하므로 인터페이스를 구현해야 한다.
- getAUthorities() 메서드 재정의 하기
- 반환타입이 Collection 이므로 컬렉션타입인 ArrayList를 하나 만들고 그 안에 "GrantedAuthority" 타입 인 익명객체를 만들어 구현하여 반환한다.
- 이 메서드는 user가 가지고 있는 권한을 가져오는 메서드이다.
- getUsername , getPassword 메서드 재정의하기
- user의 username , password를 가져오는 메서드이다.
- 그 외 메서드 재정의 하기 ( 설명은 주석으로 대신한다.)
3. 로그인 처리를 위한 UserDetailsService 구현체 작성하기
- 먼저 구현 클래스를 만들자
- 구현 클래스 내용을 작성하자
여기서 하나 설명할 것이 있다 중요하니 잘 봐야한다!!
시큐리티 설정(SecurityConfig)에서 "loginProcessingUrl('/login')" 라고 걸어뒀기에 "/login" 요청이 오면 스프링은 "UserDetailsService" 타입으로 IoC 되어있는 클래스를 찾고 그 안에 "loadUserByUsername" 메소드를 자동 실행시킨다.
그래서 로그인시 loadUserByUsername이 바로 실행 될 것이다.
추가로 PrincipalDetailsService 클래스를 만든 목적은 PrincipalDetails 타입의 객체를 "Authentication" 객체에 넣으려고 하는것이다.
4. 로그인 해보고 url 접근해보기
- 이제 준비가 다 되었으니 회원가입 부터 해보자
- 로그인을 바로 해보자
- /user url로 접근 해보자!
- 이제 로그인 이후 인증 객체를 가지고 있기 때문에 접근이 가능해진다.
- /manager , /admin 페이지 접근해보자
- 로그인한 유저의 권한이 ROLE_USER 이기 때문에 접근이 불가능하다!!
- DB에서 권한 변경후 접근해보자
- /logout 으로 로그아웃 후 다시 로그인 한 상태에서 접근해보자
이번시간에는 실질적으로 로그인 이 어떻게 이루어지고 인증은 어떻게 하는지 알아보았다.
다음 시간에는 재밌는 OAuth 로그인을 한번 해볼 것이다!!