본문 바로가기
소프트웨어/Qt

Qt Network Authorization 모듈 최신 기능: 디바이스 인증부터 자동 토큰 갱신까지

by 루이스파파 2025. 5. 9.
반응형

1. 디바이스 인증(Device Authorization Grant)

📌 대상 기기: TV, IoT, HMI 등 입력 기능이 제한된 장치
📌 동작 원리:

  1. 장치가 인증 서버에 요청 → user_codeverification_url 발급
  2. 사용자는 다른 기기(스마트폰/PC)에서 URL 접속 후 코드 입력
  3. 장치는 주기적으로 서버에 토큰 요청(Polling) 
  4. // Qt 6.9 Device Flow 예제 QOAuth2DeviceAuthorizationFlow deviceFlow; deviceFlow.setAuthorizationUrl(QUrl("https://auth.example.com/device")); deviceFlow.setTokenUrl(QUrl("https://auth.example.com/token")); deviceFlow.setClientIdentifier("client_id"); connect(&deviceFlow, &QOAuth2DeviceAuthorizationFlow::authorizeWithUserCode, [](const QUrl &url, const QString &userCode) { qDebug() << "인증 URL:" << url << " | 코드:" << userCode; }); deviceFlow.grant(); // 인증 시작

 



---

### 2. **ID 토큰(OpenID Connect)**

**📌 기능**: 사용자 신원 정보 포함한 토큰 발급
**📌 제한 사항**:

- Qt 6.9에선 **토큰 획득만 지원** (검증은 외부 라이브러리 필요)
- OpenID Connect 표준의 일부 구현

```cpp
// ID 토큰 획득 예시
QOAuth2AuthorizationCodeFlow authFlow;
authFlow.setScope("openid profile"); // OpenID 범위 지정

connect(&authFlow, &QOAuth2AuthorizationCodeFlow::authorized, [](const QString &token) {
    qDebug() << "ID 토큰:" << authFlow.idToken();
});

3. 범위 관리(Scope Management)

📌 핵심 기능:

  • requestedScopes(): 애플리케이션이 요청한 권한
  • grantedScopes(): 사용자가 실제 승인한 권한
  • 차이 발생 시 앱 동작 조정 가능
if (authFlow.grantedScopes().contains("email")) {
    // 이메일 접근 권한 있음
} else {
    // 기본 권한만 사용
}

4. 자동 토큰 갱신

📌 설정 방법:

authFlow.setAutoRefresh(true); // 자동 갱신 활성화
authFlow.setRefreshLeadTime(60); // 만료 60초 전 갱신 시도

📌 신호 활용:

connect(&authFlow, &QOAuth2AuthorizationCodeFlow::accessTokenAboutToExpire, 
        [&]() {
    authFlow.refreshTokens(); // 수동 갱신
});

통합 아키텍처


🚀 실전 활용 팁

  1. 네트워크 요청 커스터마이징:
authFlow.setNetworkRequestModifier([](QNetworkRequest *request) {
    request->setRawHeader("X-Custom-Header", "value");
});
  1. 개발용 HTTPS 리다이렉트:
authFlow.setUseHttpRedirectServer(true); // localhost 서버 사용
  1. 에러 핸들링:
connect(&authFlow, &QAbstractOAuth::errorOccurred, 
        [](const QString &error, const QString &desc) {
    qCritical() << "Error:" << error << "-" << desc;
});

 


반응형