CS
[OAuth] 회사 방문증으로 이해하는 인증 원리
민이(MInE)
2024. 11. 13. 13:29
반응형
목차
OAuth란?
OAuth는 사용자의 데이터에 대한 접근 권한을 제3자 애플리케이션에게 위임하는 표준 프로토콜입니다. 2006년 트위터와 Ma.gnolia가 주도적으로 개발한 이후, 현재는 OAuth 2.0이 널리 사용되고 있습니다.
OAuth의 필요성
- 제3자 애플리케이션의 신뢰성 보장
- 사용자 데이터의 안전한 공유
- 통합된 인증 방식 제공
OAuth vs 로그인
회사 방문 프로세스를 통해 이해하는 OAuth와 일반 로그인의 차이:
일반 로그인
- 회사 사원이 사원증으로 출입
- 직접적인 인증 방식
- 전체 권한 부여
OAuth
- 방문자가 방문증으로 제한된 공간 출입
- 중개자를 통한 인증
- 제한된 권한 부여
회사 방문 과정 | OAuth 인증 과정 |
---|---|
방문자가 안내데스크 방문 | Request Token 요청 |
안내데스크가 사원에게 방문 알림 | 인증 페이지 호출 |
사원이 방문자 신분 확인 | 사용자 로그인 |
사원이 방문 목적 기록 | 권한 요청/수락 |
방문증 발급 | Access Token 발급 |
제한된 공간 출입 | 서비스 정보 요청 |
주요 구성 요소
Resource Owner (사용자)
- 리소스의 실제 소유자
- 구글, 네이버 등의 서비스 사용자
Authorization & Resource Server
- Authorization Server: 인증 및 토큰 발급 담당
- Resource Server: 사용자의 리소스를 보유한 서버
- 하나의 서버로 통합 구현 가능
Client (애플리케이션)
- 리소스 서버의 자원을 사용하고자 하는 서비스
- 개발 중인 애플리케이션
OAuth 동작 과정
1. 사전 준비
1. Client를 Resource Server에 등록
2. Client ID, Client Secret 발급
3. Redirect URI 설정
2. 인증 요청 및 승인
GET https://authorization-server.com/auth
?response_type=code
&client_id=29352735982374239857
&redirect_uri=https://example-app.com/callback
&scope=create+delete
3. Authorization Code 발급
- 짧은 수명(1~10분)의 임시 코드
- Redirect URI로 전달
4. Access Token 교환
POST /oauth/token HTTP/1.1
Host: authorization-server.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=xxxxxxxxxxx
&redirect_uri=https://example-app.com/redirect
&client_id=xxxxxxxxxx
&client_secret=xxxxxxxxxx
구현 시 고려사항
1. Redirect URI 설정
- HTTPS 필수 (localhost 제외)
- 정확한 URI 등록 필요
- 보안상 중요한 요소
2. Token 관리
- Access Token 안전한 저장
- 적절한 만료 시간 설정
- Refresh Token 활용 고려
3. Scope 설정
const scope = [
'profile', // 기본 프로필
'email', // 이메일 주소
'calendar.readonly' // 캘린더 읽기 권한
].join(' ');
보안 주의사항
1. Client Secret 관리
// 잘못된 예
const clientSecret = "abcd1234"; // 하드코딩 금지
// 올바른 예
const clientSecret = process.env.CLIENT_SECRET;
2. Token 저장 위치
// 잘못된 예
localStorage.setItem('accessToken', token);
// 올바른 예
// HttpOnly 쿠키 사용
res.cookie('accessToken', token, {
httpOnly: true,
secure: true,
sameSite: 'strict'
});
3. HTTPS 사용
// Express.js 예제
if (process.env.NODE_ENV === 'production') {
app.use((req, res, next) => {
if (!req.secure) {
return res.redirect('https://' + req.headers.host + req.url);
}
next();
});
}
모범 사례
1. 에러 처리
async function handleOAuthCallback(code) {
try {
const token = await exchangeCodeForToken(code);
const userData = await fetchUserData(token);
return userData;
} catch (error) {
if (error.name === 'TokenExchangeError') {
// 토큰 교환 실패 처리
} else if (error.name === 'ResourceFetchError') {
// 리소스 조회 실패 처리
}
throw error;
}
}
2. 토큰 갱신
async function refreshAccessToken(refreshToken) {
try {
const response = await axios.post('auth/token', {
grant_type: 'refresh_token',
refresh_token: refreshToken
});
return response.data.access_token;
} catch (error) {
// 갱신 실패 시 재로그인 요청
redirectToLogin();
}
}
마치며
OAuth는 현대 웹/앱 개발에서 필수적인 인증 프로토콜입니다. 회사 방문증 발급 과정과 유사한 이 프로세스를 이해하고 올바르게 구현하는 것이 중요합니다.
핵심 포인트
- OAuth는 위임된 권한 부여 프로토콜
- 보안을 최우선으로 고려
- 명확한 Scope 설정 필요
- 토큰의 안전한 관리 필수
참고 자료
반응형