본문 바로가기

Backend/Spring | SpringBoot

[Oauth2] Implicit Grant vs Authorization Code Grant

반응형

Oauth2를 연동할때 Implicit 방식과 Authorization Code방식이 있다.

그 두 방식에 대해 알아보려고 한다.

 

Implicit 방식

개요

  • 주로 클라이언트 측 애플리케이션(예: 자바스크립트 앱)에서 사용
  • 인증 과정이 간단하고, 액세스 토큰을 직접 받음
  • 액세스 토큰이 URL 해시 프래그먼트에 포함되어 클라이언트에 전달

동작 과정

  1. 사용자가 클라이언트 애플리케이션에 로그인 요청
  2. 클라이언트 애플리케이션은 사용자에게 권한 부여 서버(Authorization Server)로 리디렉션
  3. 사용자는 권한 부여 서버에서 로그인하고, 요청된 권한을 승인
  4. 권한 부여 서버는 액세스 토큰을 URL 해시 프래그먼트로 클라이언트 애플리케이션에 전달
  5. 클라이언트 애플리케이션은 액세스 토큰을 추출하여 API 서버에 요청을 보낼 때 사용

장점

  • 인증 과정이 간단하고 빠름
  • 클라이언트 측에서만 동작하기 때문에 서버 측 설정이 필요 없슴

단점

  • 액세스 토큰이 URL에 포함되어 전달되기 때문에 보안 취약
  • 토큰이 브라우저 히스토리에 남을 수 있음
  • 리프레시 토큰을 사용할 수 없음

예시 코드(카카오)

function fn_kakaoPopup() {
  window.Kakao.Auth.loginForm({
    scope: 'profile_nickname, account_email', //동의항목 페이지에 있는 개인정보 보호 테이블의 활성화된 ID값을 넣습니다.
    success: function(response) {
      //console.log(response) // 로그인 성공하면 받아오는 데이터
      window.Kakao.API.request({ // 사용자 정보 가져오기
          url: '/v2/user/me',
          success: (res) => {
    const kakao_account = res.kakao_account;

    $("#kakao_account").val(kakao_account);
    $("#res").val(res);
    $("#kakao_properties").val(res.properties);
    $("#access_token").val(response.access_token);
    $("#refresh_token").val(response.refresh_token);
    $("#token_type").val(response.token_type);
    $("#scope").val(response.scope);
    $("#id").val(res.id);
    $("#email").val(kakao_account.email);

    fn_loginProcessByKakao();
          }
      });
    },
    fail: function(error) {
      console.log(error);
    }
  });
}

function fn_loginProcessByKakao(){
  ktloading.start("");
  const serializedValues = $('#frm').serializeObject();
  fnAjaxJson("POST", "/oAuth2/loginProcessByKakao", JSON.stringify(serializedValues), oAuth2Result, "");
}

 

 

Authorization Code 방식

개요

  • 주로 서버 측 애플리케이션(예: 웹 서버)에서 사용
  • 보안이 강화된 방식으로, 액세스 토큰을 직접 노출하지 않음
  • 액세스 토큰은 클라이언트가 아닌 서버 측에서 직접 교환

동작 과정

  1. 사용자가 클라이언트 애플리케이션에 로그인 요청
  2. 클라이언트 애플리케이션은 사용자에게 권한 부여 서버로 리디렉션
  3. 사용자는 권한 부여 서버에서 로그인하고, 요청된 권한을 승인
  4. 권한 부여 서버는 인증 코드(Authorization Code)를 클라이언트 애플리케이션에 전달
  5. 클라이언트 애플리케이션은 이 인증 코드를 서버 측으로 전달
  6. 서버는 이 인증 코드를 사용하여 권한 부여 서버에서 액세스 토큰을 요청하고 받음
  7. 서버는 받은 액세스 토큰을 사용하여 API 서버에 요청을 보낼 때 사용

장점

  • 액세스 토큰이 클라이언트 측에 직접 노출되지 않기 때문에 보안이 더 강함
  • 리프레시 토큰을 사용할 수 있음
  • 서버 측에서 토큰 관리를 하기 때문에 보안적으로 더 안전

단점

  • 구현이 복잡하고, 클라이언트와 서버 측 모두 설정 필요
  • 인증 과정이 다소 복잡하고 시간이 더 소요될 수 있음

예시 코드(카카오)

// Client에서 '/oauth2/authorization/kakao'로 이동해 동의를 받아 인증코드 등의 정보를 받아옴

// Spring Security에서 oauth토큰 관련 처리를 해줌
// 나의 경우에는 authenticationProvider를 구분해서 인증을 구분해서 진행하게 구현
// 코드는 따로 정리한 게시글로 이어가려고 한다.
반응형

'Backend > Spring | SpringBoot' 카테고리의 다른 글

[Oauth2] 구글 OAuth2 연동(클라이언트 ID/PW발급)  (0) 2024.07.25
[Spring Security] Exception Handler  (0) 2024.07.19
[OAuth2] 회고4  (0) 2024.06.18
[TIL] 회고 1  (0) 2024.06.17
[OAuth2] 회고3  (0) 2024.06.14