카테고리 없음
11월 6일 월요일 TIL 회고록
tft4rollz
2023. 11. 7. 02:36
OAuth2, 일반 로그인 동일하게 처리하기 -1
목표 미리보기
OAuth와 일반 로그인은 Authentication에 저장되는 타입이 다르다.
그래서 Controller 등에서 사용할 때 OAuth 로그인 유저와 일반 로그인 유저를 동일한 코드로 처리할 수가 없다.
또, 캐스팅에도 문제가 된다. 따라서 이를 동일한 타입으로 처리할 수 있도록 바꾼다.
아래 글을 읽어보면 이해할 수 있다.
OAuth
OAuth를 사용하면 구글, 네이버, 카카오, 페이스북 등의 로그인으로 로그인을 지원할 수 있다.
Dependency
// OAuth2 패키지
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
OAuth2-Client 라는 라이브러리를 통해 쉽게 구현을 할 수 있다.
Authentication
- Spring Security가 관리하는 Authentication 만 저장될 수 있다.
- Authentication 안에는 UserDetails, OAuth2User 두가지를 담을 수 있다.
- 둘 다 인터페이스로, 일반적인 로그인에는 UserDetails, OAuth 로그인에는 OAuth2User가 사용된다.
실행 순서
일반적인 로그인
- /login 으로 정보가 들어온다.
- UserDetailsService를 구현한 @Service PrincipalDetailsService의 loadUserByUsername 메서드를 호출한다.
- 이 메서드는 UserDetails 타입을 Return 한다.
- Return 된 객체는 Controller에서 @AuthenticationPrincipal 에노테이션과 함께 불러올 수 있다.
OAuth2 로그인
- 위와 같이 PrincipalOAuth2UserService의 loadUser 메서드를 호출한다.
- OAuth2User 객체를 반환한다.
- Return 된 객체는 Controller에서 @AuthenticationPrincipal 어노테이션과 함께 불러올 수 있다.
문제점
로그인 형식에 따라 Authentiocation 에 저장된 타입이 UserDetail, OAuth2User로 다르다.
타입이 다르므로 토큰 생성 메서드, 리이슈 메서드, 등등이 사용이 안됨, Controller 에서는 불러올 때 OAuth 로그인이냐 일반로그인이냐에 따라 다른 타입을 불러와야 한다는 문제가 있다.
해결
이를 해결하기 위해 UserDetail과 OAuth2User 를 동시에 구현하는 클래스를 만들어서 공통적으로 그 객체로만 사용할 수 있게 하면 된다.
동시에 구현하는 클래스를 만들기 전 일반적인 로그인, OAuth 로그인 동작 순서
동시에 구현하는 클래스를 만든 후 일반적인 로그인, OAuth 로그인 동작 순서