OAuth

김지원·2023년 11월 8일
0

https://blog.naver.com/mds_datasecurity/222182943542


OAuth 2.0(Open Authorization 2.0, OAuth2)은 인증을 위한 개방형 표준 프로토콜입니다.
이 프로토콜에서는 Third-Party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공합니다.


OAuth 2.0은 리소스 소유자를 대신하여 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 거고,
OAuth로그인은 OAuth 2.0을 응용해서 OAuth로그인을 만든거(처음 로그인할때만 함)

대부분 토큰 만들때 RSA(키2개 공개키,개인키)로 안만들고 대칭키(발행자만 검증가능)로 만듬
https://velog.io/@k7850/RSA-%EC%95%94%ED%98%B8%ED%99%94


(보통 큰기업은 인증서버 자원서버 분리되어있음)

스프링서버(클라이언트)에 홍길동(리소스오너)이 권한을 위임하는거

리소스오너가 카카오인증서버에 ID,PW보내서 JWT받으면 이걸 리소스오너가 스프링서버로 위임하고
스프링서버가 (가짜일수도 있으니까 검증 필요한데 대칭키니까 직접 검증못함) 카카오리소스서버에 한번 때려보고 자원(리소스오너 정보)을 줘야 진짜 인증이 된거

처음온거면 강제가입시키고
왔던거면 로그인시킴

이제 스프링서버가 인증된 리소스오너 정보로 새로운 토큰을 만들어서,
이제부터 이걸로 리소스오너랑 스프링서버랑만 통신하면 됨
(오직 로그인할때만 1번 OAuth로 인증해보면 됨)


  1. Authorization Code Grant│ 권한 부여 승인 코드 방식
    권한 부여 승인을 위해 자체 생성한 Authorization Code를 전달하는 방식으로 많이 쓰이고 기본이 되는 방식입니다.
    간편 로그인 기능에서 사용되는 방식으로 클라이언트가 사용자를 대신하여 특정 자원에 접근을 요청할 때 사용되는 방식입니다. 보통 타사의 클라이언트에게 보호된 자원을 제공하기 위한 인증에 사용됩니다. Refresh Token의 사용이 가능한 방식입니다.

플러터가 스프링에 토큰이 아니라 임시코드를 줌(302로 줘서 웹브라우저면 리다이랙트하게,플러터면 직접)
스프링이 임시코드로 카카오에 접근해서 맞으면 카카오가 스프링에 카카오jwt줌
스프링이 카카오jwt로 다시 카카오서버에 접근해서 유저정보를 받아옴
그걸로 강제회원가입이나 로그인시키고 새로운jwt를 만들어서 플러터에 주고 이거만 씀


크리덴셜
4. Client Credentials Grant │클라이언트 자격증명 승인 방식
클라이언트의 자격증명만으로 Access Token을 획득하는 방식입니다.
OAuth2의 권한 부여 방식 중 가장 간단한 방식으로 클라이언트 자신이 관리하는 리소스 혹은 권한 서버에 해당 클라이언트를 위한 제한된 리소스 접근 권한이 설정되어 있는 경우 사용됩니다.
이 방식은 자격증명을 안전하게 보관할 수 있는 클라이언트에서만 사용되어야 하며, Refresh Token은 사용할 수 없습니다.

플러터(프론트엔드)에서만 로그인된거

플러터에서 스프링에 요청할때 카카오jwt(액세스토큰) 담아서 던짐
스프링이 받은 카카오jwt로 카카오서버 접근해보고 되면 새로운jwt를 플러터에 줌


기본 네이티브 앱 서비스 클라이언트에서 인가 코드 및 토큰 발급 모두 처리
(크리덴셜 방식)

1. 카카오 개발자 센터 문서 읽기

https://developers.kakao.com/docs/latest/ko/kakaologin/flutter

2. 플러터 sdk 설정

https://developers.kakao.com/docs/latest/ko/flutter/getting-started#apply-sdk

개발자모드 활성화
start ms-settings:developers

dependencies:
  kakao_flutter_sdk: ^1.6.1 # 전체 추가
  kakao_flutter_sdk_user: ^1.6.1 # 카카오 로그인
  kakao_flutter_sdk_talk: ^1.6.1 # 카카오톡 메시지, 카카오톡 소셜(프로필 가져오기, 친구 목록 가져오기)
  kakao_flutter_sdk_story: ^1.6.1 # 카카오스토리
  kakao_flutter_sdk_share: ^1.6.1 # 카카오톡 공유
  kakao_flutter_sdk_navi: ^1.6.1 # 카카오내비
  kakao_flutter_sdk_friend: ^1.6.1 # 카카오톡 소셜(피커: 친구 선택하기)

3. 어플리케이션 등록

https://developers.kakao.com/console/app

4. 플랫폼 등록

앱에 서명이 필요함 (서명 된 앱만 플레이스토어 등록되어야 카카오로그인 가능)
https://developers.kakao.com/docs/latest/ko/getting-started/app

터미널에서 디버그, 릴리즈 키 해시 생성
https://developers.kakao.com/console/app/992315/config/platform

keytool -exportcert -alias androiddebugkey -keystore %USERPROFILE%.android\debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64

keytool -exportcert -alias loginkey -keystore ./ | openssl sha1 -binary | base64

5. URL 스킴 등록 (android)

https://developers.kakao.com/docs/latest/ko/flutter/getting-started#project-scheme

앞에 kakao있어야함

                <!-- "kakao${YOUR_NATIVE_APP_KEY}://oauth" 형식의 앱 실행 스킴 설정 -->
                <!-- 카카오 로그인 Redirect URI -->
                <data android:scheme="kakaoe6d0c6c4355648d4643208e909879306" android:host="oauth"/>

6. 카카오 크리덴셜 로그인 방식 사용

카카오 로그인 활성화 누르고
동의항목 닉네임
앱켜는데 오류 뜨면 안드로이드/앱/build.gradle
minSdkVersion 21

문서>Flutter>시작하기 초기화


    // 웹 환경에서 카카오 로그인을 정상적으로 완료하려면 runApp() 호출 전 아래 메서드 호출 필요
    WidgetsFlutterBinding.ensureInitialized();

    // runApp() 호출 전 Flutter SDK 초기화
    KakaoSdk.init(
        nativeAppKey: '${YOUR_NATIVE_APP_KEY}',
        javaScriptAppKey: '${YOUR_JAVASCRIPT_APP_KEY}',
    );
    runApp(MyApp());
    ```
    
안되면 cmd랑 깃배시랑 둘 다르게 나와서 그런거일수도 있으니까 두개 각각 cd로 그폴더로 이동해서 만들어서 해보기
profile
https://github.com/k7850

0개의 댓글

관련 채용 정보