hi-hyein / nyangterest

react project nyang-terest
2 stars 1 forks source link

소셜 로그인 설계 #266

Closed hi-hyein closed 3 years ago

hi-hyein commented 3 years ago

FLOW

flowchart

Database

기존 nyang_memeber table field

field name Type Description Value
id Int / INT(11) Primary Key null / 1~
username String / VARCHAR(255) 사용자 이름 null / 홍길동
email String / VARCHAR(255) 사용자 계정 (이메일 주소) null / nyangterest@gmail.com
password String / VARCHAR(255) 사용자 비밀번호 null / 암호화된 문자열
signupDate Int / INT(10) 사용자 가입 날짜 null / 20200909
certify Int / TINYINT(1) 사용자 가입 후 이메일 인증 여부 0 / 1
token String / VARCHAR(255) 사용자 인증 메일 전송을 위한 토큰 null / 암호화된 문자열

추가 nyang_memeber table field

field name Type Description Value
snsName String / VARCHAR(10) 사용자가 가입한 소셜서비스 이름 nul l/ google / kakao / naver

로그인 후 access token 처리

따라서

1. access token이 만료시 갱신해주는 로직 필요
2. refresh token 만료되면 로그아웃 처리 필요

1. Google

토큰 만료시간

Acess Token Refresh Token
1시간 (3600초) 만료시간이 따로 없고 만료되는 상황은 있다.

Refresh Token이 만료되는 경우

const strategy = new GoogleStrategy({ clientID: GOOGLE_APP_ID, clientSecret: GOOGLE_APP_SECRET, callbackURL: "http://www.example.com/auth/google/callback" }, function(accessToken, refreshToken, profile, done) { // Make sure you store the refreshToken somewhere! User.findOrCreate(..., function(err, user) { if (err) { return done(err); } done(null, user); }); });

passport.use(strategy); refresh.use(strategy);

```javascript
refresh.requestNewAccessToken('facebook', 'some_refresh_token', function(err, accessToken, refreshToken) {
  // You have a new access token, store it in the user object,
  // or use it to make a new request.
  // `refreshToken` may or may not exist, depending on the strategy you are using.
  // You probably don't need it anyway, as according to the OAuth 2.0 spec,
  // it should be the same as the initial refresh token.

});

2. API

Name Type Description
client_id string API 콘솔 에서 얻은 클라이언트 ID 입니다.
client_secret string API 콘솔 에서 얻은 클라이언트 암호 입니다
grant_type integer refresh_token
refresh_token string 인증에 성공하고 발급받은 갱신 토큰
Name Type Description
access_token string 접근 토큰, 발급 후 expires_in 파라미터에 설정된 시간(초)이 지나면 만료됨
token_type string 접근 토큰의 타입으로 Bearer와 MAC의 두 가지를 지원
expires_in integer 접근 토큰의 유효 기간(초 단위)
scope string 애플리케이션이 사용자를 대신하여 액세스 할 수있는 리소스를 식별하는 공백으로 구분 된 범위 목록

2. 카카오

토큰 만료시간

Acess Token Refresh Token
2시간 (7200초) 2개월 (만료가 1개월 남았을 때 access token이 갱신되면 둘다 재갱신된다)

갱신 방법

API

Name Type Description Required
grant_type String "authorization_code"로 고정 O
client_id String 앱 생성 시 발급 받은 REST API O
redirect_uri String 인증 코드가 리다이렉트된 URI O
code String 인증 코드 받기 요청으로 얻은 인증 코드 O
client_secret String 토큰 발급 시, 보안을 강화하기 위해 추가 확인하는 코드 [내 애플리케이션] > [보안]에서 설정 가능 ON 상태인 경우 필수 설정해야 함 X
Name Type Description
token_type String 토큰 타입, "bearer"로 고정
access_token String 사용자 액세스 토큰 값
expires_in Integer 액세스 토큰 만료 시간(초)
refresh_token String 인증에 성공하고 발급받은 갱신 토큰
refresh_token_expires_in Integer 리프레시 토큰 만료 시간(초)
scope String 인증된 사용자의 정보 조회 권한 범위 범위가 여러 개일 경우, 공백으로 구분

3. 네이버

토큰 만료시간

Acess Token Refresh Token
1시간 (3600초) ????????

갱신 방법

API

Name Type Required Description
grant_type string Y refresh_token
client_id string Y 애플리케이션 등록 시 발급받은 Client ID 값
client_secret string Y 애플리케이션 등록 시 발급받은 Client secret 값
refresh_token string Y 네이버 사용자 인증에 성공하고 발급받은 갱신 토큰(refresh token)
Name Type Description
access_token string 접근 토큰, 발급 후 expires_in 파라미터에 설정된 시간(초)이 지나면 만료됨
token_type string 접근 토큰의 타입으로 Bearer와 MAC의 두 가지를 지원
expires_in integer 접근 토큰의 유효 기간(초 단위)
error string 에러 코드
error_description string 에러 메시지
hi-hyein commented 3 years ago

로그아웃


로그아웃 처리가 필요한 경우

서버, 클라이언트 처리

서버

1. 세션제거 공통

API

2. Google api (1번 방법으로 처리가 안될 경우)

gapi.auth.authorize(
{ 
    'client_id': CLIENT_ID, 
    'scope': SCOPES,  
    'immediate': false, 
    cookie_policy: 'single_host_origin', 
    response_type: 'token id_token' 
}, function (authResult) { gapi.auth.signOut();} ); 

 gapi.auth.disconnect();

KAKAO

NAVER

hi-hyein commented 3 years ago

소셜 플랫폼 개발자페이지에서 문서를 많이 보았는데 그 문서를 보면서도 설계/분석의 중요성을 느끼게 되었다. 개발자 페이지중 어떤 페이지는 일반인이 보고 따라해도 될 정도로 잘 만들어져 있었다. 가장 중요했던 컴알못이 보았을때 이해 가능한 문서