민팽로그

구글 로그인: 백엔드에서 idToken 받아서 검증하기 본문

📚소소한 스터디

구글 로그인: 백엔드에서 idToken 받아서 검증하기

민팽 2021. 8. 22. 23:45
안드로이드에서 구글 로그인을 구현하면서 가진 의문점

백엔드 서버로 인증  |  Google Sign-In for Android  |  Google Developers

 

백엔드 서버로 인증  |  Google Sign-In for Android  |  Google Developers

백엔드 서버와 통신하는 앱 또는 사이트에서 Google 로그인을 사용하는 경우 서버에서 현재 로그인한 사용자를 식별해야 할 수 있습니다. 안전하게 하려면 사용자가 성공적으로 로그인한 후 HTTPS

developers.google.com

위 문서를 읽어보면 안드로이드에서 구글 로그인을 한 후 tokenId를 서버에 보내라고 되어 있다.

안드로이드에서 구글 로그인을 구현하면 이메일, 프로필 사진, 이름 등의 사용자 정보를 바로 얻을 수 있는데 왜 이 값들을 서버로 직접 POST하지 않고 굳이 token을 보내는지 이해를 못했는데

결론은, 내가 문서를 대충읽은거였다^_^ 보안 문제라고 경고 표시까지 해가며 강조했는데 보안쪽으로 지식이 없어서 이해도 잘 못했고 처음 접하는 oauth의 개념도 어려웠다.

아무튼 프론트에서 서버에 직접 이메일 값을 보내면 서버는 이 값이 악의적으로 변형된 값인지 알 수 없다. 때문에 프론트는 서버에 jwt토큰을 보내고 서버는 이를 받아 디코딩하여 올바른 키인지 판단한다. 올바른 키라면 안심하고 필요한 사용자 정보를 뽑아 사용하면 된다.

 

 

백엔드에서 프론트엔드로부터 받은 idToken 검증
//idToken 검증
public String verifyToken(String idTokenString) throws GeneralSecurityException, IOException {
    HttpTransport transport = new NetHttpTransport();
    GsonFactory jsonFactory = GsonFactory.getDefaultInstance();

    //web client-id...이러캐하드코드하면안되는데..ㅠㅠ 어캐하는거람...^^
    String CLIENT_ID = "발급받은 web client-id";
        
    //GoogleIdTokenVerifier 객체 반환받기: idToken을 검증하기 위해 필요함
    GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
            //백엔드에 접근하는 client_id(web client-id)
            .setAudience(Collections.singletonList(CLIENT_ID))
            // 아래 코드는 백엔드가 여러 개일 때 사용
            //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
            .build();

    // POST로 받은 idToken을 파라미터로 넘겨 토큰 검증
    GoogleIdToken idToken = verifier.verify(idTokenString);
    
    //검증 결과 유효한 토큰일 때 처리
    if (idToken != null) {
        //계정 정보가 담긴 payload
        GoogleIdToken.Payload payload = idToken.getPayload();

        // user identifier 가져오기(이메일만 저장할거라 따로 필요는 없지만 userID로도 개인 식별 가능)
        String userId = payload.getSubject();
        System.out.println("User ID: " + userId);

        // 프로필 정보 가자오기
        String email = payload.getEmail();

        // 여기부터 유저정보를 저장하거나 사용하는 코드 작성

        //이메일 반환해주기
        return email;
    } else {
        //검증 결과 유효하지 않은 토큰일 때
        return "Invalid ID token.";
    }
}

 

 

느낀 문제점

1. web client-id 하드코드: 보안 문제의 이유로 하드코드하면 안되는데 방법을 모르겠다. 안드로이드 res/val/string.xml파일처럼 사용가능한 파일이 있나..? 

2. 자바로 개발하고있으면서 자바를 잘 모른다..충격.. 예외처리 방법을 몰라서 대충 자동완성해버렸는데 이 부분은 제대로 자바 공부를 해서든 대충 구글링을 해서든 수정해야 할듯.

Comments