DataGSM OAuth SDK for React
개요
datagsm-oauth-react는 React 애플리케이션에서 DataGSM OAuth 인증을 쉽고 빠르게 연동할 수 있도록 돕는 공식 SDK입니다.
이 SDK를 사용하면 복잡한 OAuth 리디렉션 흐름을 직접 구현할 필요 없이, 제공되는 React 컴포넌트와 Hook을 통해 간편하게 로그인 기능을 구현할 수 있습니다. 특히 보안이 강화된 PKCE(Proof Key for Code Exchange) 인증 방식을 지원하여 보다 안전한 인증 환경을 구축할 수 있습니다.
PKCE 사용 권장
datagsm-oauth-react
는 auth모드를 'PKCE'로 설정하면 내부적으로
code_challenge와
code_challenge_method를 사용하여 Authorization Code 탈취 공격을 방지할 수 있습니다.
자세한 내용은 PKCE 가이드를 참고하세요.
주요 특징
| 특징 | 설명 |
|---|---|
| 간편한 연동 | OAuthProvider와 OAuthLoginButton 컴포넌트만으로 빠르게 로그인 UI를 구성할 수 있습니다. |
| PKCE 지원 | 추가적인 설정 없이 authMode 변경만으로 PKCE 인증 방식을 적용할 수 있습니다. |
| React Hook 지원 | useOAuth Hook을 제공하여 커스텀 로그인 버튼이나 로직을 유연하게 작성할 수 있습니다. |
| TypeScript 지원 | 모든 컴포넌트와 Hook은 TypeScript로 작성되어 타입 안정성을 보장합니다. |
시스템 요구사항
| 항목 | 최소 버전 | 권장 버전 |
|---|---|---|
| React | 18 | 19 이상 |
설치
npm install @themoment-team/datagsm-oauth-reactyarn add @themoment-team/datagsm-oauth-reactpnpm add @themoment-team/datagsm-oauth-react빠른 시작
1. OAuthProvider 설정
애플리케이션의 최상단 (예: App.js)을 OAuthProvider로 감싸고,
DataGSM ↗에서 발급받은 clientId와 로그인 성공 후 리다이렉트될 redirectUri를 props로 전달합니다.
// src/main.jsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { OAuthProvider } from '@themoment-team/datagsm-oauth-react';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<OAuthProvider
clientId="YOUR_CLIENT_ID"
redirectUri="YOUR_REDIRECT_URI"
authMode="PKCE"
>
<App />
</OAuthProvider>
</React.StrictMode>
);| Prop | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
clientId | string | 필수 | DataGSM에서 발급받은 클라이언트 ID |
redirectUri | string | 필수 | 로그인 성공 후 리디렉션될 URI |
authMode | 'STANDARD' | 'PKCE' | 선택 | 인증 방식 설정. 기본값은 'STANDARD'입니다. |
children | ReactNode | 필수 | OAuthProvider의 하위에 렌더링될 React 컴포넌트 |
2. 로그인 버튼 사용
OAuthLoginButton 컴포넌트를 사용하여 로그인 버튼을 렌더링할 수 있습니다. 버튼을 클릭하면 설정된 authMode에 맞춰 자동으로 DataGSM 로그인 페이지로 리다이렉션됩니다.
// src/App.jsx
import { OAuthLoginButton } from '@themoment-team/datagsm-oauth-react';
function App() {
return (
<div>
<OAuthLoginButton />
</div>
);
}
export default App;OAuthLoginButton은 표준 HTML <button> 태그의 모든 속성을 지원하며, 추가적으로 다음을 props로 받습니다.
| Prop | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
children | ReactNode | 선택 | 버튼 내부에 렌더링될 내용. 기본값은 "Data GSM 로그인"입니다. |
onClick | (event) => void | 선택 | 기본 login 함수 호출 전에 실행할 커스텀 클릭 핸들러. |
useOAuth Hook 사용하기
디자인 시스템에 맞는 커스텀 버튼을 만들거나, 로그인 기능을 버튼 클릭 외의 다른 액션과 연결하고 싶을 때는 useOAuth Hook을 사용할 수 있습니다.
// src/components/CustomLoginButton.jsx
import { useOAuth } from '@themoment-team/datagsm-oauth-react';
function CustomLoginButton() {
const { login } = useOAuth();
const handleLogin = async () => {
// PKCE 모드인 경우 login() 호출 시 code_verifier가 자동 생성되어 sessionStorage에 저장됩니다.
await login();
};
return (
<button onClick={handleLogin}>
커스텀 로그인 버튼
</button>
);
}
export default CustomLoginButton;useOAuth Hook은 다음 값을 포함하는 객체를 반환합니다.
| 반환 값 | 타입 | 설명 |
|---|---|---|
login | () => Promise<void> | 호출 시 DataGSM OAuth 로그인 페이지로 리디렉션하는 함수 |
clientId | string | OAuthProvider에 전달된 클라이언트 ID |
redirectUri | string | OAuthProvider에 전달된 리디렉션 URI |
authMode | 'STANDARD' | 'PKCE' | 현재 설정된 인증 방식 |
getCodeVerifier | () => string | null | 저장된 PKCE code_verifier를 가져오는 함수 |
clearVerifier | () => void | 저장된 PKCE code_verifier를 삭제하는 함수 |
PKCE 인증 방식 사용하기
PKCE(Proof Key for Code Exchange) 모드를 사용하면 로그인 과정에서 보안을 한층 더 강화할 수 있습니다.
OAuthProvider의authMode를"PKCE"로 설정합니다.login()함수가 실행되면 SDK 내부적으로code_verifier를 생성하여sessionStorage에 저장하고, 이에 대응하는code_challenge를 생성하여 인증 서버로 함께 보냅니다.- 리다이렉트된 페이지(Callback URI)에서 백엔드에 액세스 토큰을 요청할 때,
getCodeVerifier()를 통해 저장된code_verifier값을 가져와 함께 전달해야 합니다. - 토큰 요청이 완료된 후에는
clearVerifier()를 호출하여 저장된 값을 삭제하는 것이 권장됩니다.
// Callback 페이지 예시
import { useEffect } from 'react';
import { useOAuth } from '@themoment-team/datagsm-oauth-react';
function CallbackPage() {
const { getCodeVerifier, clearVerifier } = useOAuth();
useEffect(() => {
const codeVerifier = getCodeVerifier();
const code = new URLSearchParams(window.location.search).get('code');
if (code && codeVerifier) {
// 백엔드 API 호출 시 code와 codeVerifier를 함께 전달
fetchAccessToken(code, codeVerifier).finally(() => {
clearVerifier(); // 사용 후 정리
});
}
}, []);
return <div>로그인 중...</div>;
}
export default CallbackPage;문제 해결
자주 발생하는 문제
Error: useOAuth must be used within OAuthProvider
원인: useOAuth Hook이나 OAuthLoginButton 컴포넌트가 OAuthProvider의 자식 컴포넌트로 렌더링되지 않았습니다.
해결 방법:
- 애플리케이션의 최상위 컴포넌트가
OAuthProvider로 감싸져 있는지 확인하세요. useOAuth또는OAuthLoginButton을 사용하는 컴포넌트가OAuthProvider의 하위 트리에서 렌더링되는지 확인하세요.
추가 리소스
- GitHub 저장소: DataGSM OAuth SDK React ↗
- 이슈 트래커: GitHub Issues ↗
문의사항이나 버그 리포트는 GitHub Issues를 통해 제출해 주세요.