[OAuth] 회사 방문증으로 이해하는 인증 원리
반응형
목차
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 설정 필요
- 토큰의 안전한 관리 필수
참고 자료
반응형
'CS' 카테고리의 다른 글
트랜잭션과 격리 수준 완벽 가이드 (0) | 2024.11.12 |
---|---|
쿠키와 세션 (0) | 2024.09.03 |
왜 MVC 패턴을 사용하고 있나요? (5) | 2024.08.29 |
댓글