솔적솔적

Spring Boot Security - Authentication 객체가 가질 수 있는 2가지 타입 본문

Back-end/Spring Boot Security

Spring Boot Security - Authentication 객체가 가질 수 있는 2가지 타입

솔솔봄향기 2022. 2. 9. 10:01

getClientRegistration 에는 서버에 기본 정보들이 들어있다.

어떤 OAuth로 로그인 했는지 확인한다.

 

구글로그인 버튼 클릭을 하면 구글로그인창 나오고

로그인완료 하면 code를 리턴(OAuth-Client라이브러리) => Access Token요청

 

이 userRequest정보로 뭘해야하냐면

회원프로필 정보를 받아야함(loadUser 함수호출) -> 구글 회원프로필 받아준다.

 

PrincipalOauth2UserService

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
	//구글로 부터 받은 userRequest데이터에 대한 후처리 되는 함수
	@Override
	public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
		System.out.println("getClientRegistration:"+userRequest.getClientRegistration());
		System.out.println("getAccessToken:"+userRequest.getAccessToken().getTokenValue());
		System.out.println("getAttributes:"+super.loadUser(userRequest).getAttributes());
		//받은 getAttributes 정보로 강제 회원가입을 시킬 것이다.
		
		OAuth2User oauth2User = super.loadUser(userRequest); 
		
		return super.loadUser(userRequest);
	}
}

 

 

 

 

IndexController.java

	@GetMapping("/test/login")
	public @ResponseBody String testLogin(Authentication authentication,
			@AuthenticationPrincipal PrincipalDetails userDetails) { //DI 의존성 주입
		System.out.println("/test/login=========");
		PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
		System.out.println("authentication:"+principalDetails.getUser());
		
		System.out.println("userDetails:"+userDetails.getUser());
		return "세션 정보 확인하기";
	}

 

	@GetMapping("/test/login")
	public @ResponseBody String testLogin(Authentication authentication,
			@AuthenticationPrincipal PrincipalDetails userDetails) { //DI 의존성 주입
		System.out.println("/test/login=========");
		PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
		System.out.println("authentication:"+principalDetails.getUser());
		
		System.out.println("userDetails:"+userDetails.getUser());
		return "세션 정보 확인하기";
	}
	
	@GetMapping("/test/oauth/login")
	public @ResponseBody String testOAuthLogin(
			Authentication authentication){ //DI 의존성 주입
		System.out.println("/test/login=========");
		OAuth2User oauth2User = (OAuth2User) authentication.getPrincipal();
		System.out.println("authentication:"+oauth2User.getAttributes());
		
		return "OAuth 세션 정보 확인하기";
	}

 

세션안에 시큐리티가 관리하는 세션이 있고 Authentication 있어야한다.

이 Authentication 안에 들어갈 수 있는 두개의 타입이 있는데, 
UserDetails와 OAuth2User타입이 들어갈 수 있다. 

시큐리티가 들고 있는 세션에는 무조건 이 Authentication 객체만 들어갈 수 있으며
들어가는 순간 로그인이 되는 것이고 

일반 로그인은 UserDetails
구글, 페이스북 등의 OAuth 로그인은 OAuth2User
들어가게되면 세션이 생기고 로그인이 되는 것이다.

 

 

 

세션 정보를 찾을 때 한 번 찾을 때마다 처리하는 것이 복잡하기 때문에 
PrincipalDetails으로 묶는다면 이PrincipalDetails으로  타입만 찾으면 둘 다 번거롭지 않게 찾을 수 있다. 

 

IndexController.java

	@GetMapping("/user")
	public @ResponseBody String user(@AuthenticationPrincipal PrincipalDetails principalDetails) {
		return "user";
	}

 

PrincipalDetails.java - 둘을 묶어놓기

public class PrincipalDetails implements UserDetails, OAuth2User{

....}

 

 

 

[참조] : 인프런 -  스프링부트 시큐리티 & JWT 강의