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. 보안 고려사항
- HTTPS 사용 필수: 토큰과 코드 전송은 반드시 암호화해야 한다.
- Redirect URI 고정: 사전에 등록된 주소만 허용해야 한다.
- 토큰 유효 시간 설정: Access Token은 짧게, Refresh Token은 길게 설정한다.
- 토큰 저장 위치: 클라이언트에서는 로컬 저장소 사용 시 보안에 주의한다.
8. 실습 예: 카카오 OAuth 인증 흐름
- 클라이언트가 사용자에게 로그인 및 동의 요청
- 사용자는 카카오에 로그인하고 동의
- 클라이언트는 인가 코드를 수신
- 인가 코드를 사용해 Access Token을 요청
- 발급된 Access Token으로 카카오 API 호출 가능