ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Security - OAuth 적용 개념도
    웹 개발/Spring Boot 2022. 1. 26. 16:25

    [ Session 처리]

     

    id/pw 로그인을 하며 UserDetails 타입으로 데이터가 들어오고

    OAuth로 로그인을 하면 OAuth2User 타입으로 데이터가 들어옵니다.

    이때,

    Session에 등록할 때 이 두개 타입을 모두 상속 받은 PrincipalDetails를 만들고 그 안에 속성을 User(사용자 정보, 사용자 테이블)을 넣으면 됩니다. 


    또한, Session에 개발자 뭔가를 더 넣고 싶다면 어떻게 해야 할까요?

    User를 상속받고 추가로 속성을 만든 class를 만들면 될 것이라 추정됩니다.

    아직 실습은 하지 않아서요...

     

    public class MySessionInfo extends User {
    
    	private String ssInfo1;
    	private String ssInfo2;
    	private String ssInfo3;
    }

    PrincipalDetails에 MySessionInfo를 넣으면 될 것 같습니다.

     

    	// 테스트 메소드 영역 ===========================================================================
    	
    	@GetMapping("/test/login")
    	public @ResponseBody String testLogin(
    			Authentication authentication, 
    			@AuthenticationPrincipal PrincipalDetails principalDetails, // 표준적으로 이 방법을 가져오면 모든 데이터를 다 확인할 수 있음
                @AuthenticationPrincipal UserDetails userDetails,
                @AuthenticationPrincipal OAuth2User oauth2usr) {
    		
    		PrincipalDetails authenticationPrincipalDetails = (PrincipalDetails) authentication.getPrincipal();
    		
    		System.out.println("\n===========/test/login : authenticationPrincipalDetails =======================================");
    		System.out.println("authenticationPrincipalDetails            : "  + authenticationPrincipalDetails);
    		System.out.println("authenticationPrincipalDetails.getUser()  : "  + authenticationPrincipalDetails.getUser());
    //      << 출력 결과 >>		
    //		authenticationPrincipalDetails            : 
    //		PrincipalDetails(
    //			user=User(id=18,
    //			          username=google_105569722421410314586, 
    //		              password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, 
    //                    email=siseondev@gmail.com, 
    //                    role=ROLE_USER, 
    //                    provider=google, 
    //                    providerId=105569722421410314586, 
    //                    createDate=2022-01-25 09:36:29.401), 
    //          attributes={
    //		              sub=105569722421410314586, 
    //                    name=Dev SiSeon, 
    //                    given_name=Dev, 
    //                    family_name=SiSeon, 
    //                    picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, 
    //                    email=siseondev@gmail.com, 
    //                    email_verified=true, locale=ko})
    //                              
    //		authenticationPrincipalDetails.getUser()  : 
    //			User(id=18, 
    //			     username=google_105569722421410314586, 
    //			     password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, 
    //			     email=siseondev@gmail.com, 
    //			     role=ROLE_USER, 
    //			     provider=google, 
    //			     providerId=105569722421410314586, 
    //			     createDate=2022-01-25 09:36:29.401)
    
    		System.out.println("\n===========/test/login : principalDetails =======================================");
    		System.out.println("principalDetails                  : "  + principalDetails);
    		System.out.println("principalDetails.getUser() 내 DB에 저장한 것    : "  + principalDetails.getUser());
    		System.out.println("principalDetails.getAttributes() 포털로 받은 것 : "  + principalDetails.getAttributes());
    		System.out.println("getUser().getId()         : "  + principalDetails.getUser().getId());
    		System.out.println("getUser().getUsername()   : "  + principalDetails.getUser().getUsername());
    		System.out.println("getUser().getPassword()   : "  + principalDetails.getUser().getPassword());
    		System.out.println("getUser().getProvider()   : "  + principalDetails.getUser().getProvider());
    		System.out.println("getUser().getProviderId() : "  + principalDetails.getUser().getProviderId());
    		System.out.println("getUser().getCreateDate() : "  + principalDetails.getUser().getCreateDate());
    //      << 출력 결과 >>
    //		principalDetails                : 
    //			PrincipalDetails(
    //				user=User(          // principalDetails.getUser() 결과와 동일(내 DB에 저장한 것)
    //					id=18, 
    //					username=google_105569722421410314586, 
    //					password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, 
    //					email=siseondev@gmail.com, 
    //					role=ROLE_USER, 
    //					provider=google, 
    //					providerId=105569722421410314586, 
    //					createDate=2022-01-25 09:36:29.401), 
    //				attributes={        // principalDetails.getAttributes() 결과와 동일 (포털로 받은 것)
    //					sub=105569722421410314586, 
    //					name=Dev SiSeon, 
    //					given_name=Dev, 
    //					family_name=SiSeon, 
    //					picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, 
    //					email=siseondev@gmail.com, email_verified=true, locale=ko})
    //		principalDetails.getUser()      : 
    //			User(
    //				id=18, 
    //				username=google_105569722421410314586, 
    //				password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, 
    //				email=siseondev@gmail.com, 
    //				role=ROLE_USER, 
    //				provider=google, 
    //				providerId=105569722421410314586, 
    //				createDate=2022-01-25 09:36:29.401)
    //		getUser().getId()         : 18
    //		getUser().getUsername()   : google_105569722421410314586
    //		getUser().getPassword()   : $2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC
    //		getUser().getProvider()   : google
    //		getUser().getProviderId() : 105569722421410314586
    //		getUser().getCreateDate() : 2022-01-25 09:36:29.401
    		
    		System.out.println("\n===========/test/login : userDetails =======================================");
    		System.out.println("userDetails                     : "  + userDetails);
    		System.out.println("userDetails.getUsername()       : "  + userDetails.getUsername());
    //      << 출력 결과 >>
    //		userDetails                     : 
    //			PrincipalDetails(
    //				user=User(
    //					id=18, 
    //					username=google_105569722421410314586, 
    //					password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, 
    //					email=siseondev@gmail.com, 
    //					role=ROLE_USER, 
    //					provider=google, 
    //					providerId=105569722421410314586, 
    //					createDate=2022-01-25 09:36:29.401), 
    //				attributes={
    //					sub=105569722421410314586, 
    //					name=Dev SiSeon, 
    //					given_name=Dev, 
    //					family_name=SiSeon, 
    //					picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, 
    //					email=siseondev@gmail.com, 
    //					email_verified=true, 
    //					locale=ko})
    //		userDetails.getUsername()   : 
    //			google_105569722421410314586
    
    		System.out.println("\n===========/test/login : oauth2usr =======================================");
    		System.out.println("oauth2usr                       : "  + oauth2usr);
    		System.out.println("oauth2usr.getAttributes()       : "  + oauth2usr.getAttributes());
    //      << 출력 결과 >>
    //		oauth2usr                       : 
    //			PrincipalDetails(
    //				user=User(
    //					id=18, 
    //					username=google_105569722421410314586, 
    //					password=$2a$10$xyqE5.K6neKSPZeKauQSdesWXXItRm0UmfgAXpFsWSi/AQ7Bh5XkC, 
    //					email=siseondev@gmail.com, role=ROLE_USER, 
    //					provider=google, providerId=105569722421410314586, 
    //					createDate=2022-01-25 09:36:29.401), 
    //				attributes={
    //					sub=105569722421410314586, 
    //					name=Dev SiSeon, 
    //					given_name=Dev, 
    //					family_name=SiSeon, 
    //					picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, 
    //					email=siseondev@gmail.com, 
    //					email_verified=true, 
    //					locale=ko})
    //		oauth2usr.getAttributes()       : 
    //			{
    //				sub=105569722421410314586, 
    //				name=Dev SiSeon, 
    //				given_name=Dev, 
    //				family_name=SiSeon, 
    //				picture=https://lh3.googleusercontent.com/a/AATXAJzJEBX76MxuaszSr4Rnb6sb3IVabV9OkMD8abpx=s96-c, 
    //				email=siseondev@gmail.com, 
    //				email_verified=true, 
    //				locale=ko
    //			}
    		
    		return "세션 정보 확인하기";
    	}

    결론적으로 여러 방법이 있지만 @AuthenticationPrincipal PrincipalDetails principalDetails 이것을 통하여 모든 정보를 다시 읽어 활용할 수 있는 것이다.

    principalDetails.getUser()은 나의 DB에 저장된 사용자 정보이고

    System.out.println("principalDetails.getUser() 내 DB에 저장한 것    : "  + principalDetails.getUser());
    System.out.println("principalDetails.getUser().getId()         : "  + principalDetails.getUser().getId());
    System.out.println("principalDetails.getUser().getUsername()   : "  + principalDetails.getUser().getUsername());
    System.out.println("principalDetails.getUser().getPassword()   : "  + principalDetails.getUser().getPassword());
    System.out.println("principalDetails.getUser().getProvider()   : "  + principalDetails.getUser().getProvider());
    System.out.println("principalDetails.getUser().getProviderId() : "  + principalDetails.getUser().getProviderId());
    System.out.println("principalDetails.getUser().getCreateDate() : "  + principalDetails.getUser().getCreateDate());

    principalDetails.getAttributes()은 구글, 네이버 등에서 받은 정보가 된다.

    Map<String, Object> 타입으로 받아 읽어야 함

    System.out.println("principalDetails.getAttributes() 포털로 받은 것 : "  + principalDetails.getAttributes());
    System.out.println("principalDetails.getAttributes().get(\"sub\")        : " + principalDetails.getAttributes().get("sub"));
    System.out.println("principalDetails.getAttributes().get(\"name\")       : " + principalDetails.getAttributes().get("name"));
    System.out.println("principalDetails.getAttributes().get(\"given_name\") : " + principalDetails.getAttributes().get("given_name"));
    System.out.println("principalDetails.getAttributes().get(\"family_name\"): " + principalDetails.getAttributes().get("family_name"));
    System.out.println("principalDetails.getAttributes().get(\"picture\")    : " + principalDetails.getAttributes().get("picture"));
    System.out.println("principalDetails.getAttributes().get(\"email\")      : " + principalDetails.getAttributes().get("email"));

    댓글

Designed by Tistory | Siseon i.