Google 공식문서 : https://developers.google.com/identity/protocols/oauth2?hl=ko

Google 사용자 API 참고 문서 : https://blog.itcode.dev/posts/2021/10/23/oauth2-java-server-5

kakao 공식문서 : https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

❗️Google OAuth 사용자 API 는 못찾아서 다른 블로그 글 보고 정리함

Oauth 별 제공하는 데이터 비교

1. 구글 응답 데이터

{
    "sub": "90234582532742",
    "name": "First Last",
    "given_name": "First",
    "family_name": "Last",
    "picture": "<https://lh3.googleusercontent.com/a-/hash>",
    "email": "[email protected]",
    "email_verified": true,
    "locale": "ko"
}

2. 카카오 응답 데이터

HTTP/1.1 200 OK
{
    "id":123456789,
    "connected_at": "2022-04-11T01:45:28Z",
    "kakao_account": { 
        // 프로필 또는 닉네임 동의 항목 필요
        "profile_nickname_needs_agreement	": false,
        // 프로필 또는 프로필 사진 동의 항목 필요
        "profile_image_needs_agreement	": false,
        "profile": {
            // 프로필 또는 닉네임 동의 항목 필요
            "nickname": "홍길동",
            // 프로필 또는 프로필 사진 동의 항목 필요
            "thumbnail_image_url": "<http://yyy.kakao.com/.../img_110x110.jpg>",
            "profile_image_url": "<http://yyy.kakao.com/dn/.../img_640x640.jpg>",
            "is_default_image":false
        },
        // 이름 동의 항목 필요
        "name_needs_agreement":false, 
        "name":"홍길동",
        // 카카오계정(이메일) 동의 항목 필요
        "email_needs_agreement":false, 
        "is_email_valid": true,   
        "is_email_verified": true,
        "email": "[email protected]",
        // 연령대 동의 항목 필요
        "age_range_needs_agreement":false,
        "age_range":"20~29",
        // 출생 연도 동의 항목 필요
        "birthyear_needs_agreement": false,
        "birthyear": "2002",
        // 생일 동의 항목 필요
        "birthday_needs_agreement":false,
        "birthday":"1130",
        "birthday_type":"SOLAR",
        // 성별 동의 항목 필요
        "gender_needs_agreement":false,
        "gender":"female",
        // 카카오계정(전화번호) 동의 항목 필요
        "phone_number_needs_agreement": false,
        "phone_number": "+82 010-1234-5678",   
        // CI(연계정보) 동의 항목 필요
        "ci_needs_agreement": false,
        "ci": "${CI}",
        "ci_authenticated_at": "2019-03-11T11:25:22Z",
    },
    "properties":{
        "${CUSTOM_PROPERTY_KEY}": "${CUSTOM_PROPERTY_VALUE}",
        ...
    },
    "for_partner": {
        "uuid": "${UUID}"
    }
}

3. 필요 데이터 취합

구글 카카오
이름 O 동의 시 제공
이메일 O 동의 시 제공
전화번호 X 동의 시 제공
프로필 URL O 동의 시 제공

사용자 테이블 설계

CREATE TABLE member (
	id int NOT NULL AUTO_INCREMENT,
	oauth_id varchar(255) NOT NULL,
	name varchar(50), # oauth 계정의 실제 이름
	nickname varchar(50), # 고하이어 닉네임(사용자 별도 설정 필요)
	phone_number varchar(50),
	email varchar(100),
	role varchar(50), # 권한 : GUEST, USER, ADMIN
	resource_id int, # 프로필 정보
	--- 논의 필요
	archived boolean, # 삭제여부
	archived_at datetime, # 삭제 일자
	created_at datetime, # 생성 일자
	updated_at datetime, # 수정 일자
  CONSTRAINT member_PK PRIMARY KEY(id)
);

# Refresh Token : 사용자 아이디, 토큰, 생성일자, 만료일자