액세스 토큰

Facebook 로그인을 사용하여 앱에 연결하면, 앱에서 Facebook API에 대한 임시 보안 액세스를 제공하는 액세스 토큰을 얻게 됩니다.

액세스 토큰은 사용자, 앱 또는 페이지를 식별하는 불명확한 문자열이며 앱에서 그래프 API를 호출하는 데 사용할 수 있습니다. 액세스 토큰은 여러 메서드를 통해 얻을 수 있으며 각 메서드는 이 문서의 뒷 부분에서 다룹니다. 토큰에는 만료 시기와 토큰을 생성한 앱에 대한 정보가 있습니다. 공개 범위 확인으로 인해 Facebook에서 수행되는 대부분의 API 호출에는 액세스 토큰이 포함되어야 합니다. 다음과 같이 액세스 토큰마다 여러 다른 사용 사례를 지원합니다.

액세스 토큰 유형 설명

사용자 액세스 토큰

사용자 토큰은 가장 일반적으로 사용되는 토큰 유형입니다. 앱에서 특정 사용자 대신 Facebook의 데이터를 읽고 수정하고 쓰기 위해 API를 호출할 때마다 이 유형의 액세스 토큰이 필요합니다. 사용자 액세스 토큰은 일반적으로 로그인 대화 상자를 통해 얻으며, 사용자가 앱에서 토큰을 확보할 수 있도록 허용해야 합니다.

앱 액세스 토큰

이 유형의 액세스 토큰은 앱 설정을 수정하고 읽는 데 필요합니다. 오픈 그래프 액션을 게시하는 데도 사용할 수 있습니다. 앱과 Facebook 간에 사전 합의된 시크릿을 사용하여 생성한 다음 앱 전체 설정을 변경하는 호출 중에 사용합니다. 서버 간 호출을 통해 앱 액세스 토큰을 얻습니다.

페이지 액세스 토큰

이러한 액세스 토큰은 Facebook 페이지에 속한 데이터를 읽거나 쓰거나 수정하는 API에 대한 권한을 제공한다는 점을 제외하고는 사용자 액세스 토큰과 비슷합니다. 페이지 액세스 토큰을 확보하려면 사용자 액세스 토큰을 확보하고 manage_pages 권한을 요청하는 작업부터 시작해야 합니다. 사용자 액세스 토큰이 있으면 그래프 API를 통해 페이지 액세스 토큰을 가져옵니다.

클라이언트 토큰

클라이언트 토큰은 앱을 식별하도록 기본 모바일 바이너리 또는 데스크톱 앱에 포함(embed)할 수 있는 ID로, 앱에 포함(embed)되어 있으므로 시크릿 ID로 사용할 수 없습니다. 클라이언트 토큰은 앱 레벨 API에 액세스하는 데 사용하지만 매우 제한된 하위 집합에만 해당됩니다. 앱의 대시보드에 있지만 드물게 사용되므로 이 문서에서는 클라이언트 토큰을 설명하지 않습니다. 대신 클라이언트 토큰을 사용하는 API 문서에서 다룹니다.

액세스 토큰 생성

- 사용자 액세스 토큰

- 앱 액세스 토큰

- 페이지 액세스 토큰


사용자 액세스 토큰

플랫폼마다 서로 다른 API를 통해 액세스 토큰을 생성하지만 사용자 토큰을 가져올 때는 모두 기본 전략을 따릅니다.

플랫폼마다 이 프로세스를 시작하는 메서드가 서로 다르며, 개발자와 권한을 부여하는 사용자 대신 액세스 토큰을 관리하는 기능을 포함합니다.

Javascript

JavaScript용 Facebook SDK에서는 자동으로 사용자 액세스 토큰을 얻어 브라우저 쿠키에 유지합니다. 응답에 accessToken 속성을 포함할 FB.getAuthResponse를 호출하여 사용자 액세스 토큰을 가져올 수 있습니다.

Android

Android용 Facebook SDK에서는 com.facebook.AccessToken 클래스를 통해 사용자 액세스 토큰을 자동으로 관리합니다. Android용 Facebook 로그인을 구현하여 사용자 액세스 토큰을 가져오는 방법에 대해 자세히 알아볼 수 있습니다. Session.getCurrentAccessToken을 검사하여 사용자 액세스 토큰을 가져올 수 있습니다.

iOS

iOS용 Facebook SDK에서는 FBSDKAccessToken 클래스를 통해 사용자 액세스 토큰을 자동으로 관리합니다. iOS용 Facebook 로그인을 구현하여 사용자 액세스 토큰을 가져오는 방법에 대해 자세히 알아볼 수 있습니다. FBSDKAccessToken.currentAccessToken을 검사하여 액세스 토큰을 가져올 수 있습니다.

웹(JavaScript를 포함하지 않음)

JavaScript용 Facebook SDK 없이 웹에서 앱을 빌드할 때 해당 문서에 간략하게 설명된 과정 중에 액세스 토큰을 생성해야 합니다.

코드 샘플

Android

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this.getApplicationContext());
    accessToken = AccessToken.getCurrentAccessToken();
}

iOS

- (void)viewDidLoad
{
  [super viewDidLoad];
  NSString *accessToken = [FBSDKAccessToken currentAccessToken];
}

JavaScript(웹)

FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    var accessToken = response.authResponse.accessToken;
  } 
} );

단기 토큰 및 장기 토큰

사용자 액세스 토큰은 단기 실행 토큰과 장기 실행 토큰의 두 양식으로 제공됩니다. 일반적으로 단기 실행 토큰의 사용 시간은 약 1~2시간인 반면, 장기 실행 토큰의 사용 시간은 약 60일입니다. 이러한 사용 시간이 동일하게 유지될 것으로 기대하지 않아야 합니다. 경고 없이 사용 시간이 변경되거나 조기에 만료될 수 있습니다. 오류 처리에서 자세히 알아보세요.

웹 로그인을 통해 생성된 액세스 토큰은 단기 실행 토큰이지만, 앱 시크릿 코드와 함께 서버 측 API를 호출하여 장기 실행 토큰으로 변환할 수 있습니다.

Facebook의 iOS 및 Android SDK를 사용하는 모바일 앱은 기본적으로 장기 실행 토큰을 가져옵니다.

장기 실행 토큰을 사용할 때 Facebook의 마케팅 API에 대한 표준 액세스 권한이 있는 앱은 만료 시간이 없는 장기 실행 토큰을 받게 됩니다. 이 토큰은 다른 이유로 인해 여전히 무효화할 수 있지만 단지 시간 때문에 만료되지 않습니다. 비즈니스 관리자의 시스템 사용자를 위한 액세스 토큰의 경우에도 해당됩니다.

이동식 토큰

액세스 토큰의 중요한 요소 중 하나는 이동이 가능하다는 점입니다. 액세스 토큰을 받게 되면 모바일 클라이언트나 웹 브라우저에서 호출하거나 서버에서 Facebook 서버로 호출하는 데 사용할 수 있습니다. 클라이언트에서 토큰을 가져오면 이 토큰을 서버에 보내 서버 간 호출에 사용할 수 있습니다. 서버 호출을 통해 토큰을 가져오면 이 토큰을 클라이언트에 보내 클라이언트에서 호출할 수 있습니다.

사용자 계정의 보안을 위해 클라이언트와 서버 간 토큰 이동은 HTTPS를 통해 안전하게 수행해야 합니다. 클라이언트와 서버 간에 토큰을 이동하는 경우 미치는 영향에 대해 자세히 읽어보세요.

앱 액세스 토큰

앱 액세스 토큰은 사용자가 아니라 앱 대신 Facebook API를 요청을 하는 데 사용됩니다. 이 토큰은 앱의 매개변수를 수정하거나, 테스트 사용자를 만들고 관리하거나, 앱의 인사이트를 읽는 데 사용할 수 있습니다.

제한 사항

사용자 액세스 토큰을 사용하여 요청하는 앱에 일반적으로 표시되는 사용자 데이터 중 일부는 앱 액세스 토큰을 사용하는 경우 표시되지 않을 수 있습니다. 사용자 데이터를 읽고 앱에서 사용하는 경우 앱 액세스 토큰이 아니라 사용자 액세스 토큰을 사용해야 합니다.

앱 대시보드의 고급 설정에서 앱이 Native/Desktop으로 설정된 경우 앱 액세스 토큰은 안전하지 않은 것으로 간주되므로 API 호출 시 작동하지 않습니다. 그 이유는 기본 또는 데스크톱 앱에 앱 시크릿 코드가 포함(embed)되므로 해당 시크릿 코드를 사용하여 생성된 앱 액세스 토큰이 안전하지 않기 때문입니다.

앱 액세스 토큰 생성

앱 액세스 토큰을 생성하려면 그래프 API를 호출해야 합니다.

GET /oauth/access_token
    ?client_id={app-id}
    &client_secret={app-secret}
    &grant_type=client_credentials

이 호출을 수행하면 위에 명시된 대로 API를 호출하기 위해 사용자 액세스 토큰 대신 사용할 수 있는 앱 액세스 토큰을 반환합니다. 다시 한번 보안상의 이유로 앱 액세스 토큰을 클라이언트 측 코드에 하드 코딩하지 않아야 합니다. 하드 코딩하면 웹 페이지를 읽어들였거나 앱을 역컴파일한 모든 사람이 앱 시크릿 코드에 완전하게 액세스할 수 있으므로 앱을 수정할 수 있게 됩니다. 대부분의 경우 서버 간 호출에서만 앱 액세스 토큰을 사용합니다.

참고: 이 요청에서는 앱 시크릿 코드를 사용하므로 역컴파일될 수 있는 앱 바이너리나 클라이언트 측 코드에서 호출하지 않아야 합니다. 앱 시크릿 코드를 다른 사용자와 절대 공유하지 않아야 합니다. 그러므로 이 API는 서버 측 코드를 사용해서만 호출해야 합니다.

생성된 앱 액세스 토큰을 사용하지 않아도 되는 다른 방법으로 그래프 API를 호출할 수 있습니다. 호출할 때 앱 ID와 앱 시크릿 코드만 access_token 매개변수로 전달할 수 있습니다.

https://graph.facebook.com/endpoint?key=value&access_token=app_id|app_secret

생성된 액세스 토큰을 사용할지 아니면 이 메서드를 사용할지는 앱 시크릿 코드를 숨긴 위치에 따라 선택할 수 있습니다.

페이지 액세스 토큰

그래프 API 호출에서 페이지 액세스 토큰을 사용하여 Facebook 페이지를 관리합니다. 페이지 액세스 토큰을 생성하려면 페이지 관리자가 manage_pages라는 확장 권한을 부여해야 합니다. 이 권한이 부여되고 나면 필수 권한이 있는 사용자 액세스 토큰과 다음 그래프 API 요청을 사용하여 페이지 액세스 토큰을 가져올 수 있습니다.

GET /me/accounts HTTP/1.1
Host: graph.facebook.com

그러면 페이지 카테고리, 해당 페이지에 대한 관리자의 권한 등 페이지 관련 기타 정보와 함께 관리하는 페이지 리스트와 페이지 액세스 토큰을 반환합니다.

{
  "data": [
    {
      "category": "Product/service",
      "name": "Sample Page",
      "access_token": "{access-token}",
      "id": "1234567890",
      "perms": [
        "ADMINISTER",
        "EDIT_PROFILE",
        "CREATE_CONTENT",
        "MODERATE_CONTENT",
        "CREATE_ADS",
        "BASIC_ADMIN"
      ]
    }, 
}

페이지 액세스 토큰이 있으면 페이지를 대신하여 API 호출을 생성할 수 있습니다. 예를 들어 사용자의 타임라인이 아니라 페이지에 상태 업데이트를 게시하거나 페이지 인사이트 데이터를 읽을 수 있습니다.

페이지 액세스 토큰은 페이지, 관리자 및 앱마다 다릅니다.

페이지 관리자에게는 여러 다른 역할이 있으며, 위의 예처럼 반환된 perms 배열로 표시됩니다. 관리자가 사용할 수 있는 기능은 perms 값을 기반으로 결정되며, 토큰 및 역할에 설명되어 있습니다.