본문 바로가기

[OAuth] 회사 방문증으로 이해하는 인증 원리

민이(MInE) 2024. 11. 13.
반응형

 

목차

  1. OAuth란?
  2. OAuth vs 로그인
  3. 주요 구성 요소
  4. OAuth 동작 과정
  5. 구현 시 고려사항
  6. 보안 주의사항

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는 현대 웹/앱 개발에서 필수적인 인증 프로토콜입니다. 회사 방문증 발급 과정과 유사한 이 프로세스를 이해하고 올바르게 구현하는 것이 중요합니다.

핵심 포인트

  1. OAuth는 위임된 권한 부여 프로토콜
  2. 보안을 최우선으로 고려
  3. 명확한 Scope 설정 필요
  4. 토큰의 안전한 관리 필수

참고 자료

https://hudi.blog/oauth-2.0/

 

OAuth 2.0 개념과 동작원리

2022년 07월 13일에 작성한 글을 보충하여 새로 포스팅한 글이다. OAuth 등장 배경 우리의 서비스가 사용자를 대신하여 구글의 캘린더에 일정을 추가하거나, 페이스북, 트위터에 글을 남기는 기능을

hudi.blog

 

반응형

'CS' 카테고리의 다른 글

트랜잭션과 격리 수준 완벽 가이드  (0) 2024.11.12
쿠키와 세션  (0) 2024.09.03
왜 MVC 패턴을 사용하고 있나요?  (5) 2024.08.29

댓글