1. 소개
Visual Studio Code (VS Code)와 Huachao Mao의 Rest Client 확장 프로그램을 사용하면 Google OAuth 동의 흐름과 Google Health API를 테스트할 수 있습니다. 이 Codelab에서는 Rest Client 확장 프로그램을 설정하는 방법, 승인 흐름을 시작하는 방법, Google Health API 엔드포인트 중 하나에 첫 번째 호출을 하는 방법을 알아봅니다. 그런 다음 Rest Client 문서와 Fitbit 문서를 읽고 HTTP 프로젝트에서 다른 엔드포인트를 구성할 수 있습니다.
VS Code 및 Rest Client를 사용하지 않으려면 curl 명령어를 사용하여 API 호출을 수행하면 됩니다.
학습할 내용
- Rest 클라이언트 확장 프로그램으로 VS Code를 설정하는 방법
- Google Cloud 콘솔 내에서 클라이언트 ID를 설정하는 방법
- Google OAuth 2.0 승인 흐름을 거쳐 액세스 토큰과 갱신 토큰을 가져오는 방법
- Rest 클라이언트를 사용하여 Google Health API 엔드포인트를 호출하는 방법
필요한 항목
- Fitbit 모바일 앱
- Visual Studio Code
- Huacho Mao의 Rest Client 확장 프로그램
Fitbit 모바일 앱을 설정하는 방법:
- Apple App Store 또는 Google Play 스토어에서 Fitbit 모바일 앱을 검색하여 다운로드합니다.
- 앱 아이콘을 선택합니다.
- Google 계정으로 로그인을 클릭합니다.
- Google 계정을 선택하고 계속 버튼을 누릅니다.
Visual Studio 도구를 설치하려면 다음 단계를 따르세요.
- VS Code를 다운로드합니다. 일반적으로 다운로드에는 실행 파일이 포함됩니다.
- VS Code를 시작합니다.
- Huachao Mao의 Rest Client 확장 프로그램을 설치합니다.
- IDE 왼쪽에 있는 확장 프로그램 아이콘
을 클릭합니다. - REST Client by Huachao Mao를 검색하고 설치를 누릅니다.
- IDE 왼쪽에 있는 확장 프로그램 아이콘
2. Google Cloud 프로젝트 설정
Google Cloud 콘솔을 사용하여 클라이언트 ID를 만들고 Google Health API 사용을 사용 설정합니다.
- Google Cloud 콘솔에 로그인합니다.
- 새 프로젝트를 만들려면 다음 단계를 따르세요.
- 프로젝트 선택 도구에서 프로젝트 선택을 클릭합니다.
- 오른쪽 상단에서 새 프로젝트를 선택합니다.
- 프로젝트 이름을 입력합니다.
- 위치를 입력합니다 (예: '조직 없음').
- 만들기 버튼을 클릭합니다.
- 프로젝트를 선택합니다.
Google Health API 사용 설정
- 왼쪽 상단에서 메뉴 아이콘
을 클릭합니다. - API 및 서비스 > 라이브러리를 선택합니다.
- 'Google Health API'를 검색하여 사용 설정합니다.
OAuth 사용자 인증 정보 설정
Google Cloud 콘솔에 있지 않은 경우 Google Cloud 콘솔로 이동합니다.
- 왼쪽 상단에서 메뉴 아이콘
을 클릭합니다. - API 및 서비스 > 사용자 인증 정보를 선택합니다.
- 상단 중앙에서 + 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 선택합니다.
- 동의 화면 구성 버튼을 클릭합니다. 'Google 인증 플랫폼이 아직 구성되지 않음'이라는 메시지가 표시되면 시작하기 버튼을 클릭합니다.
- 섹션 1에서 다음을 수행합니다.
- 앱 이름을 입력합니다.
- 사용자 지원 이메일을 입력합니다.
- 다음 버튼을 클릭합니다.
- 섹션 2:
- 외부를 선택합니다.
- 다음 버튼을 클릭합니다.
- 섹션 3에서 다음을 수행합니다.
- 연락처 정보 필드에 이메일 주소를 입력합니다.
- 다음 버튼을 클릭합니다.
- 섹션 4에서 다음을 수행합니다.
- 체크박스를 클릭하여 Google의 API 서비스 사용자 데이터 정책에 동의합니다.
- 만들기 버튼을 클릭합니다.
- 측정항목 섹션에서 OAuth 클라이언트 만들기 버튼을 누릅니다.
- 애플리케이션 유형으로 웹 애플리케이션을 선택합니다.
- 클라이언트 ID 이름을 입력합니다.
- 승인된 JavaScript 원본은 비워 둡니다.
- 승인된 리디렉션 URI에서 + URI 추가 버튼을 누릅니다. 리디렉션 URI로 'https://www.google.com'을 입력합니다.
- 만들기 버튼을 클릭합니다.
- Google Console에 클라이언트 ID가 생성되었다는 메시지가 표시됩니다. JSON 다운로드 링크를 클릭하여 클라이언트 ID와 클라이언트 보안 비밀번호를 다운로드하거나 값을 적어 둡니다. 나중에 클라이언트의 보안 비밀을 복구할 수 없습니다.
- 확인을 클릭합니다. 'OAuth 2.0 클라이언트 ID' 페이지로 돌아갑니다.
- 클라이언트 ID가 프로젝트에 추가됩니다. 클라이언트 ID URL을 클릭하여 세부정보를 확인합니다.
테스트 사용자 추가
- 왼쪽 창에서 잠재고객을 선택합니다. '게시 상태'가 테스트로 설정되고 '사용자 유형'이 외부로 설정되어 있습니다.
- '테스트 사용자' 섹션에서 + 사용자 추가 버튼을 클릭합니다. 데이터를 가져오려는 사용자의 이메일 주소를 입력합니다.
- 저장 버튼을 클릭합니다.
클라이언트 ID에 범위 추가
- 왼쪽 창에서 데이터 액세스를 선택합니다.
- 범위 추가 또는 삭제 버튼을 클릭합니다.
- API 열에서 'Google Health API'를 검색합니다. 이 Codelab에서는
.../auth/googlehealth.activity_and_fitness.readonly범위를 사용합니다. - 범위를 선택한 후 업데이트 버튼을 눌러 데이터 액세스 페이지로 돌아갑니다.
- 저장 버튼을 클릭합니다.
클라이언트 ID 설정을 완료했습니다.
3. 승인 흐름 만들기
- 머신에서 VS Code 앱을 엽니다.
- 시작 화면에서 열기를 선택합니다.
- 이 프로젝트를 만들 폴더를 선택하고 열기를 누릅니다. 화면에는 탐색기에 폴더 또는 프로젝트 이름이 표시됩니다.

- 기본 메뉴에서 파일 -> 새 텍스트 파일을 선택합니다.
- 파일을 저장하여 이름을 지정합니다. 기본 메뉴에서 File -> Save As -> Codelab.http를 선택합니다. 이렇게 하면 파일이 프로젝트에 배치됩니다. 파일 확장자는 .http 또는 .rest여야 합니다. 이 Codelab에서는 .http를 사용합니다.
이 프로젝트에서는 여러 값을 여러 번 사용합니다. 이러한 값은 다음과 같습니다.
| Google 콘솔의 클라이언트 ID 값입니다. |
| Google 콘솔의 클라이언트 보안 비밀번호 값입니다. |
| 승인 코드를 처리하는 앱의 엔드포인트입니다. 이 Codelab에서는 https://www.google.com을 사용합니다. |
| 동의 흐름이 완료된 후 사용자를 위해 생성된 액세스 토큰입니다. |
| 동의 흐름이 완료된 후 사용자를 위해 생성된 갱신 토큰입니다. |
이 프로젝트에 사용되는 변수를 정의하는 다음 코드를 추가합니다. 파일 Codelab.http의 상단에 있어야 합니다. client_id 및 secret 값을 입력합니다.
### File Variables for the Codelab
@client_id =
@secret =
@redirect_uri = https://www.google.com
@accessToken={{user.response.body.access_token}}
@refreshToken={{user.response.body.refresh_token}}
동의 흐름을 시작하는 데 사용되는 승인 URL이 데이터에 액세스하려는 각 사용자에게 전송됩니다. 승인 URL을 빌드하려면 Google OAuth 엔드포인트를 알아야 하며 쿼리 매개변수를 사용하여 클라이언트 ID, 액세스하려는 범위, 사용자가 범위에 동의할 때 리디렉션할 위치를 지정해야 합니다. Google 승인 문자열 빌드에 관한 전체 문서는 문서에서 확인할 수 있습니다.
Google의 OAuth 2.0 엔드포인트는 https://accounts.google.com/o/oauth2/v2/auth에 있습니다. 이 엔드포인트는 HTTPS를 통해서만 액세스할 수 있습니다. 일반 HTTP 연결은 거부됩니다.
Google 승인 서버는 웹 서버 애플리케이션이 승인 흐름을 맞춤설정할 수 있도록 다양한 쿼리 문자열 매개변수를 지원합니다. 필수 쿼리 매개변수 client_id, redirect_uri, response_type, scope이 사용됩니다. 문서에는 모든 쿼리 매개변수와 설명이 나열되어 있습니다.
쿼리 매개변수의 값은 다음과 같습니다.
| Google 콘솔의 클라이언트 ID 값 |
| 승인 코드를 처리하는 앱의 엔드포인트입니다. Codelab에서는 https://www.google.com을 사용합니다. |
|
|
| 범위는 Google 콘솔에서 가져오며, 구문은 https://www.googleapis.com 뒤에 범위 이름이 옵니다. 예: https://www.googleapis.com/auth/googlehealth.activity_and_fitness |
변수 뒤에 승인 URL을 다음과 같이 작성합니다. 프로젝트 상단에 정의된 매개변수는 승인 문자열에서 사용할 수 없습니다. 따라서 client_id 및 redirect_uri 값을 포함해야 합니다. client-id 문자열을 클라이언트 ID로 바꿉니다.
### Google Health API Rest Client Example
### Authorization String
https://accounts.google.com/o/oauth2/v2/auth?client_id=client-id&redirect_uri=https://www.google.com&response_type=code&access_type=offline&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
사용자가 동의를 부여하면 Google에서 승인 코드를 제공하며, 개발자는 Google의 토큰 엔드포인트를 호출하여 이 코드를 액세스 토큰으로 교환합니다. 승인 문자열 아래의 Codelab.http에 토큰 엔드포인트를 호출하기 위한 다음 정의를 추가합니다. 다음 단계에서 authorization-code를 승인 코드로 바꿉니다.
### AUTHORIZATION ENDPOINTS
######################################################################
# @name user
POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded
code=authorization-code&client_id={{clientId}}&client_secret={{secret}}&redirect_uri={{redirect_uri}}&grant_type=authorization_code
@name user는 데이터에 액세스하는 현재 사용자를 참조합니다.
4. 계정을 승인하고 토큰 가져오기
이제 승인 토큰을 획득하기 위한 승인 흐름을 살펴보겠습니다.
Codelab.http의 승인 문자열은 Google의 브라우저 기반 동의 흐름을 시작하는 데 사용됩니다. Rest Client 확장 프로그램에 이 URL에 대한 Send Request 링크가 표시될 수 있습니다. 이 특정 URL에 요청 보내기를 사용하지 마세요. 대신 브라우저에 복사하여 붙여넣거나 VS Code에서 Ctrl+클릭 (Windows/Linux) 또는 Cmd+클릭 (Mac)을 사용하여 기본 브라우저에서 엽니다.
https://accounts.google.com/o/oauth2/v2/auth?client_id=client-id&redirect_uri=https://www.google.com&response_type=code&access_type=offline&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
- Google 계정에 로그인하라는 메시지가 표시됩니다. 테스트 사용자 추가 섹션에서 구성한 테스트 사용자 계정 중 하나를 사용하여 로그인해야 합니다.
- 앱이 인증되지 않았다는 메시지가 표시될 수 있습니다. 이는 앱이 게시되지 않았기 때문입니다. '계속'을 누릅니다.

- 동의 페이지에는 요청된 범위가 표시됩니다. 사용자는 이 앱과 공유할 범위를 선택할 수 있습니다. '계속'을 클릭합니다.
요청된 범위를 공유하는 데 동의하면 지정한 redirect_uri (이 Codelab에서는 https://www.google.com)로 리디렉션됩니다. Google은 승인 코드와 기타 매개변수를 redirect_uri에 추가하므로 브라우저의 주소 표시줄에 표시되는 URL은 다음과 같습니다.
https://www.google.com/?code=4/0Ab32j93oyGWqaXE112sP1IKmh3kV1fE4tcHIMXYJQYWgNEtAa_0-YsfkS9Ekj3Be89u3fw&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
인증 코드는 'code='와 '&scope' 사이의 영숫자 값입니다. 위의 예에서 값은 다음과 같습니다.
4/0Ab32j93oyGWqaXE112sP1IKmh3kV1fE4tcHIMXYJQYWgNEtAa_0-YsfkS9Ekj3Be89u3fw
프로덕션 앱에서 서버는 URL 매개변수에서 이를 파싱합니다. 이 Codelab에서는 브라우저의 URL에서 승인 코드를 복사합니다.
이제 이 승인 코드를 access_token 및 refresh_token로 교환합니다. Codelab.http에서 POST /token 요청 본문의 authorization-code을 복사한 승인 코드로 바꿉니다.
POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded
code=authorization-code&client_id={{client_id}}&client_secret={{secret}}&redirect_uri={{redirect_uri}}&grant_type=authorization_code
POST https://oauth2.googleapis.com/token 줄 바로 위에 있는 요청 보내기 링크를 클릭합니다.
응답은 다음과 유사합니다.
{
"access_token": "ya29.a0ATi6K2uasci7FyyIClNLtQou6z...",
"expires_in": 3599,
"refresh_token": "1//05EuqYpEXjJCHCgYIA...",
"scope": "https://www.googleapis.com/auth/googlehealth.activity_and_fitness",
"token_type": "Bearer",
"refresh_token_expires_in": 604799
}
이 응답을 받으면 Rest Client는 후속 요청에 사용할 수 있도록 Codelab.http 상단에 정의된 @accessToken 및 @refreshToken 변수를 자동으로 채웁니다.
갱신 토큰 정보
승인 코드를 교환할 때 응답에 access_token 외에 refresh_token가 포함될 수 있습니다. access_token는 수명이 짧습니다 (일반적으로 1시간). access_token이 만료되면 사용자가 다시 로그인하거나 동의하지 않아도 되도록 refresh_token을 사용하여 새 access_token을 획득해야 합니다. 이는 승인 요청에 access_type=offline를 포함했기 때문에 가능합니다.
대답에 refresh_token가 표시되지 않으면 이 앱과 범위에 대해 이미 동의를 부여했기 때문일 수 있습니다. 새로고침 토큰은 일반적으로 사용자가 앱에 처음 동의를 부여할 때 또는 후속 승인에서도 동의 화면이 표시되도록 승인 URL에 prompt=consent가 추가될 때만 발급됩니다.
refresh_token는 수명이 길지만 6개월 동안 사용하지 않거나 사용자가 앱에 대한 액세스 권한을 취소하거나 기타 이유로 만료되거나 무효화될 수 있습니다. 나중에 사용할 수 있도록 refresh_token를 안전하게 저장해야 합니다.
자세한 내용은 액세스 토큰 갱신 (오프라인 액세스)을 참고하세요.
5. Fitbit 모바일 앱에 데이터 추가하기
Fitbit 신규 사용자의 경우 Fitbit 계정에 쿼리할 데이터가 없을 수 있습니다. 엔드포인트 중 하나를 통해 쿼리할 수 있는 운동 로그를 수동으로 추가할 것입니다. 운동을 수동으로 기록하려면 다음 단계를 따르세요.
- 기기에서 Fitbit 모바일 앱을 엽니다. 필요한 경우 Fitbit 계정에 로그인합니다.
- 화면 오른쪽 하단에서 + 버튼을 탭합니다.
- '수동으로 기록' 섹션에서 활동을 탭합니다.
- 운동 유형 걷기를 검색하여 선택합니다.
- 오늘의 시작 시간을 입력합니다.
- 기간을 15분으로 변경합니다.
- 거리를 1.0마일로 둡니다.
- 추가를 탭합니다.
- 화면을 길게 누르고 아래로 슬라이드하여 모바일 앱을 Fitbit 서버와 동기화합니다. 손가락을 떼면 모바일 앱이 동기화됩니다.
- '활동' 섹션에 수동으로 기록한 '걷기' 항목이 표시됩니다.

6. 목록 메서드를 사용하여 데이터 가져오기
list 메서드를 호출하려면 /token 엔드포인트 바로 아래에 있는 Codelab.http에 다음 코드를 추가합니다.
### users.dataTypes.dataPoints
#####################################################
### LIST exercise
GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints
Authorization: Bearer {{accessToken}}
Accept: application/json
이 코드는 list 엔드포인트를 호출하여 사용자가 Fitbit 계정에 기록한 걸음 수를 표시합니다. 매분의 걸음 수는 Fitbit Web API v1 Activity Intraday 엔드포인트와 마찬가지로 응답에 반환됩니다.
호출을 실행하려면 GET 엔드포인트의 요청 보내기 링크를 누릅니다. 응답은 다음과 유사합니다.
{
"dataPoints": [
{
"name": "users/2515055256096816351/dataTypes/exercise/dataPoints/8896720705097069096",
"dataSource": {
"recordingMethod": "MANUAL",
"platform": "FITBIT"
},
"exercise": {
"interval": {
"startTime": "2026-02-23T13:10:00Z",
"startUtcOffset": "-18000s",
"endTime": "2026-02-23T13:25:00Z",
"endUtcOffset": "-18000s"
},
"exerciseType": "WALKING",
"metricsSummary": {
"caloriesKcal": 16,
"distanceMillimiters": 1609344,
"steps": "2038",
"averagePaceSecondsPerMeter": 0.55923407301360051,
"activeZoneMinutes": "0"
},
"exerciseMetadata": {},
"displayName": "Walk",
"activeDuration": "900s",
"exerciseEvents": [
{
"eventTime": "2026-02-23T13:10:00Z",
"eventUtcOffset": "-18000s",
"exerciseEventType": "START"
},
{
"eventTime": "2026-02-23T13:25:00Z",
"eventUtcOffset": "-18000s",
"exerciseEventType": "STOP"
}
],
"updateTime": "2026-02-24T01:19:22.450466Z"
}
},
{
"name": "users/2515055256096816351/dataTypes/exercise/dataPoints/5870930690409355408",
"dataSource": {
"recordingMethod": "MANUAL",
"platform": "FITBIT"
},
"exercise": {
"interval": {
"startTime": "2026-02-23T06:00:00Z",
"startUtcOffset": "-18000s",
"endTime": "2026-02-23T06:15:00Z",
"endUtcOffset": "-18000s"
},
"exerciseType": "WALKING",
"metricsSummary": {
"caloriesKcal": 17,
"distanceMillimiters": 1609344,
"steps": "2038",
"averagePaceSecondsPerMeter": 0.55923407301360051,
"averageHeartRateBeatsPerMinute": "81",
"activeZoneMinutes": "0",
"heartRateZoneDurations": {
"lightTime": "900s"
}
},
"exerciseMetadata": {},
"displayName": "Walk",
"activeDuration": "900s",
"exerciseEvents": [
{
"eventTime": "2026-02-23T06:00:00Z",
"eventUtcOffset": "-18000s",
"exerciseEventType": "START"
},
{
"eventTime": "2026-02-23T06:15:00Z",
"eventUtcOffset": "-18000s",
"exerciseEventType": "STOP"
}
],
"updateTime": "2026-02-23T08:29:39.480437Z"
}
}
],
"nextPageToken": ""
}
많은 엔드포인트가 필터링 또는 페이지로 나누기를 위한 쿼리 매개변수를 지원합니다. 예를 들어 운동은 interval.civil_start_time 필터를 지원합니다. 특정 기간 내의 운동을 나열하려면 다음 요청을 Codelab.http에 추가합니다.
### LIST exercise >= civil start time
GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints?filter=exercise.interval.civil_start_time >= "2026-02-22T00:00:00"
Authorization: Bearer {{accessToken}}
Accept: application/json
7. 축하합니다
축하합니다.
기본 Codelab을 완료하고 Visual Studio Code와 Rest Client 확장 프로그램을 사용하여 OAuth 2.0 승인을 테스트하고 Google Health API 엔드포인트를 호출하는 방법을 성공적으로 배웠습니다. 여기에서 섹션 List 메서드를 사용하여 데이터 가져오기의 시작 부분에서와 마찬가지로 추가 엔드포인트를 추가할 수 있습니다.
Google Health API 생태계와 통합되는 앱을 빌드하는 데 도움이 되기를 바랍니다. 자세한 내용은 참조 문서에서 다른 Google Health API 엔드포인트를 살펴보고 웹 서버 애플리케이션용 Google OAuth 2.0에 대해 자세히 알아보세요.