일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Expo
- Spring Boot
- YOLOv5
- pandas
- google cloud
- Spring
- marksense.ai
- google login
- C++
- oauth
- google 로그인
- 졸프
- 양방향 매핑
- skt fellowship 3기
- 커스텀 데이터 학습
- AWS
- @Transactional
- 순환참조
- JPA
- matplotlib
- Loss Function
- 2021 제9회 문화공공데이터 활용경진대회
- idToken
- 코드업
- javascript
- OG tag
- react native
- html
- yolo
- STT
- Today
- Total
민팽로그
구글 로그인: 백엔드에서 idToken 받아서 검증하기 본문
안드로이드에서 구글 로그인을 구현하면서 가진 의문점
백엔드 서버로 인증 | 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. 자바로 개발하고있으면서 자바를 잘 모른다..충격.. 예외처리 방법을 몰라서 대충 자동완성해버렸는데 이 부분은 제대로 자바 공부를 해서든 대충 구글링을 해서든 수정해야 할듯.
'📚소소한 스터디' 카테고리의 다른 글
자주 사용하는 리눅스 명령어 (0) | 2021.08.24 |
---|---|
OAuth, 구글 로그인 이해에 참고했던 포스팅 모음 (0) | 2021.08.23 |
구글 로그인 테스트: 안드로이드에서 백엔드 서버로 인증 (0) | 2021.08.21 |
git 정리 (0) | 2021.08.18 |
가비아 사용: 도메인을 ip주소에 연결하기 (0) | 2021.08.12 |