14주차_참고 : OAuth 2.0 인증 체계 - dhryu60/SmartDevice_2025-1 GitHub Wiki

OAuth 2.0 인증 체계

1. OAuth 2.0 개요

OAuth 2.0은 인터넷 사용자들이 자신의 로그인 정보(ID/PW)를 제3자에게 제공하지 않고도 외부 서비스가 본인의 계정 자원에 접근할 수 있도록 권한을 위임하는 표준 인증 프로토콜이다.

주로 Google, Facebook, Kakao, GitHub 등의 로그인 연동, API 호출 시 사용된다.


2. 주요 개념 정리

용어 정의
Resource Owner 자원 소유자 (예: 사용자 본인)
Client 자원 접근을 요청하는 앱 또는 서비스 (예: IoT 기기, 웹서비스 등)
Authorization Server 사용자 인증 및 토큰 발급을 담당하는 서버 (예: Kakao OAuth 서버)
Resource Server 보호된 자원이 저장된 서버 (예: 카카오 메시지 전송 API)
Access Token 클라이언트가 자원에 접근할 수 있는 권한 증명 수단
Refresh Token Access Token이 만료됐을 때 재발급을 위한 토큰

3. 인증 흐름: Authorization Code Grant

가장 일반적으로 사용되는 인증 방식으로, 보안성이 높아 웹 서비스, 모바일 앱에서 사용된다.

1단계: 클라이언트 → 인가 요청

GET https://auth.server.com/oauth/authorize
  ?response_type=code
  &client_id=CLIENT_ID
  &redirect_uri=https://client.com/callback
  &scope=read_profile
  &state=random_string
  • 사용자에게 로그인 및 동의 요청 창이 표시된다.

2단계: 사용자 → 로그인 및 동의

  • 사용자가 로그인하고, 요청한 권한(예: 친구 목록 조회)에 대해 동의한다.

3단계: Authorization Code 발급 (Redirect)

302 Found
Location: https://client.com/callback?code=AUTH_CODE&state=random_string
  • 인증이 성공하면 등록된 Redirect URI로 인가 코드(code)를 전달한다.

4단계: Access Token 요청

POST https://auth.server.com/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=AUTH_CODE
&redirect_uri=https://client.com/callback
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET

5단계: Access Token 응답

{
  "access_token": "xyz123",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "abc456"
}
  • 응답으로 Access Token과 Refresh Token이 전달된다.

4. Access Token 사용

Access Token은 API 요청 시 Authorization 헤더에 포함하여 사용한다.

GET https://api.resource.com/user
Authorization: Bearer xyz123

Access Token이 유효한 경우, 자원 서버는 요청된 데이터(예: 사용자 정보)를 반환한다.


5. Refresh Token 사용

Access Token이 만료되면 Refresh Token을 사용하여 새 Access Token을 발급받는다.

POST https://auth.server.com/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&refresh_token=abc456
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET

6. 다양한 인증 방식 (Grant Type)

Grant Type 설명
Authorization Code 가장 안전한 방식. 인가 코드 사용
Implicit 브라우저 기반 앱용. 현재는 권장하지 않음
Resource Owner Password Credentials 사용자 ID/PW를 직접 입력받음. 제한적으로 사용
Client Credentials 사용자 없이 앱 자체 인증. 서버 간 통신에 사용

7. 보안 고려사항

  1. HTTPS 사용 필수: 토큰과 코드 전송은 반드시 암호화해야 한다.
  2. Redirect URI 고정: 사전에 등록된 주소만 허용해야 한다.
  3. 토큰 유효 시간 설정: Access Token은 짧게, Refresh Token은 길게 설정한다.
  4. 토큰 저장 위치: 클라이언트에서는 로컬 저장소 사용 시 보안에 주의한다.

8. 실습 예: 카카오 OAuth 인증 흐름

  1. 클라이언트가 사용자에게 로그인 및 동의 요청
  2. 사용자는 카카오에 로그인하고 동의
  3. 클라이언트는 인가 코드를 수신
  4. 인가 코드를 사용해 Access Token을 요청
  5. 발급된 Access Token으로 카카오 API 호출 가능

9. 참고 링크