반응형
Oauth2를 연동할때 Implicit 방식과 Authorization Code방식이 있다.
그 두 방식에 대해 알아보려고 한다.
Implicit 방식
개요
- 주로 클라이언트 측 애플리케이션(예: 자바스크립트 앱)에서 사용
- 인증 과정이 간단하고, 액세스 토큰을 직접 받음
- 액세스 토큰이 URL 해시 프래그먼트에 포함되어 클라이언트에 전달
동작 과정
- 사용자가 클라이언트 애플리케이션에 로그인 요청
- 클라이언트 애플리케이션은 사용자에게 권한 부여 서버(Authorization Server)로 리디렉션
- 사용자는 권한 부여 서버에서 로그인하고, 요청된 권한을 승인
- 권한 부여 서버는 액세스 토큰을 URL 해시 프래그먼트로 클라이언트 애플리케이션에 전달
- 클라이언트 애플리케이션은 액세스 토큰을 추출하여 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 방식
개요
- 주로 서버 측 애플리케이션(예: 웹 서버)에서 사용
- 보안이 강화된 방식으로, 액세스 토큰을 직접 노출하지 않음
- 액세스 토큰은 클라이언트가 아닌 서버 측에서 직접 교환
동작 과정
- 사용자가 클라이언트 애플리케이션에 로그인 요청
- 클라이언트 애플리케이션은 사용자에게 권한 부여 서버로 리디렉션
- 사용자는 권한 부여 서버에서 로그인하고, 요청된 권한을 승인
- 권한 부여 서버는 인증 코드(Authorization Code)를 클라이언트 애플리케이션에 전달
- 클라이언트 애플리케이션은 이 인증 코드를 서버 측으로 전달
- 서버는 이 인증 코드를 사용하여 권한 부여 서버에서 액세스 토큰을 요청하고 받음
- 서버는 받은 액세스 토큰을 사용하여 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 |