안드로이드 oauth 1.0a, 2.0 구현 - naver, google api

49
13한국자바개발자 컨퍼런스 OAuth 기반 오픈 API 활용 실전 옥상훈(@okgosu)

Upload: gosu-ok

Post on 22-Nov-2014

7.503 views

Category:

Technology


5 download

DESCRIPTION

OAuth 개념 소개 OAuth 1.0a, 2.0 특징 안드로이드에서 OAuth 구현 방법

TRANSCRIPT

Page 1: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

OAuth 기반 오픈 API 활용 실전

옥상훈(@okgosu)

Page 2: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 발표자 소개

前 한국자바 개발자 협의회 회장(2007~2008) 現 OkGosu.Net 운영자 現 플랫폼 전문가 그룹 정회원 現 NHN 컨텐츠 제휴팀 부장 現 ZDNet UX 컬럼니스트 (2007~현재) 前 Adobe, Macromedia RIA Consulting 前 한국 SW 아키텍트 연합 공동 회장(2008~2010)

<저서> - NHN 오픈 API를 활용한 매시업 (2012.9.14, 공저) - okgosu의 플렉스 4.5 & 플래시 빌더 정석(2011.6) - okgosu의 액션스크립트의 정석(2010.4) - 예제로 배우는 플렉스(2006.9)

* 네이버 Open API 개발가이드 작성 (2011.10.18)

Page 3: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 인증이란?

• 어떤 사람이나 사물이 실제 그 사람 또는 사물인지를 판단하는 과정

• 일반적인 인증은 아이디와 비밀번호를 이용

Page 4: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 id/pw 방식 인증의 위험성

• 잘 모르는 써드파티앱에 자신이 가입한 서비스(예: 네이버)의 아이디와 암호를 직접 입력하면 누출의 위험이 있음.

Page 5: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 등장 배경

• 사용자 입장에서는 ID/PW를 써드파티앱에 노출하지 않고 회원 인증할 수 있어야 함.

• 서비스 제공자 입장에서는 인증한 API에 대해 권한을 부여하고 이에 따라 API를 제공할 수 있어야 함.

Page 6: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 버전

• 2007년 10월 : OAuth 1.0 발표

• 2008년 6월: OAuth 1.0a (1.0의 보안 문제를 해결한 수정 버전)

• 2010년 4월 : OAuth 1.0a가 IETF 표준으로 등록 • RFC5849 – The OAuth 1.0 Protocol

• 2012년 3월: OAuth 2.0 draft 배포

• 2012년 10월: OAuth 2.0이 IETF 표준으로 등록

• RFC6749 - The OAuth 2.0 Authorization Framework • RFC6750 – Bearer Token 사용

Page 7: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 적용 기업

Oauth 적용 인터넷 서비스 기업 OAuth 버전

Facebook 2.0

Foursquare 2.0

Google 2.0

Microsoft (Hotmail, Messenger, Xbox) 2.0

LinkedIn 2.0

Daum(티스토리 2.0

NHN (오픈API) 1.0a

Daum(요즘, 오픈API) 1.0a

MySpace 1.0a

Netflix 1.0a

트위터 1.0a

Vimeo 1.0a

Yahoo! 1.0a

Page 8: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 1.0a 작동 방식

• 3-legged model • User : 사용자 (예: 네이버 회원) • Consumer: 써드파티앱 (예: 카페앱 개발사) • Service Provider: 플랫폼 서비스 제공자 (예: 네이버 서비스)

• OAuth 인증 프로세스

• 써드파티앱은 회원을 서비스 제공자 화면으로 이동시켜 회원인증을 하면 서비스 제공자로부터 접근토큰(Access Token)을 전달받음 • 서비스 제공자의 API를 호출할 때 접근토큰을 함께 넘겨야 사용 가능

• 예) 네이버 회원 – 카페앱 – 네이버 서비스

2) 네이버 로그인 화면 이동

4) 접근 토큰 전달 (Access Token) 1) 네이버 로그인 요청

3) 네이버 로그인

Page 9: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 인증 절차 – 이용자 관점

1) 컨슈머가 제공한 앱에서 ‘네이버 카페목록보기’를 실행한다. 2) 네이버 로그인 화면으로 자동으로 이동하고, 유저가 네이버 아이디와 비밀번호를 입력한다

3) 네이버 회원 인증 성공시 컨슈머에 대해서 정보 접근 허용 여부를 묻는 화면으로 이동

4) 유저가 컨슈머에 대한 정보 접근을 허락하면 네이버 카페목록 보기 화면이동

네이버 로그인 화면 컨슈머 정보 접근 허락 화면

Page 10: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 컨슈머 등록

• 컨슈머가 OAuth를 이용하기 위해서는, 서비스 제공자에게 컨슈머 정보를 등록해 컨슈머키와 시크릿값을 발급 받아야 함

- Consumer Key는 서비스 제공자가 써드파티앱을 식별하기 위한 아이디 - Consumer Secret은 컨슈머에서 전달한 요청을 서비스 제공자가 검증할 수 있도록 하는 비밀 코드

Page 11: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 1.0a 개발

• OAuth 1.0a 개발은 서비스 제공자로부터 ‘접근토큰’을 발급 받기 위함

1단계) 서비스 제공자에게 요청토큰(Request Token)을 요청함 이때 oauth_signature, oauth_consumer_key, oauth_nonce를 비롯한 6가지의 매개변수를 서버에 전달해야 하며, oauth_signature는 지정된 방식으로 암호화 처리한 서명값임.

2단계) 화면을 서비스 제공자의 로그인 페이지로 이동시킴 사용자가 로그인 후, 컨슈머의 정보를 보고 접근을 승인

3단계) 서비스 제공자에게 접근토큰(Access Token)을 요청함. 서비스제공자는 컨슈머에게 접근 토큰을 발급하고 컨슈머의 콜백URL로 이동

Page 12: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 1.0a 전체 절차

Page 13: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 2.0의 등장

• 2010년 4월 말 OAuth 2.0 draft 등록 • OAuth 1.0a은 2010년 4월

• OAuth 1.0의 불편한 점을 개선하기 위해 처음부터 IEFT에서 스펙논의 시작 • 암호화, 다양한 앱 지원 등 애플리케이션에 대한 지원 강화

• 스펙정의를 위해 개발자를 비롯한 플랫폼사(구글, 페이스북, 세일즈포스닷컴 등) 에서도 적극 참여하는 과정에서 잡음이 있었음 • Eran Hammer의 OAuth 2.0에 대한 불만

• OAuth 2.0은 2012년 10월에 IETF 표준 등록

• RFC6749 - The OAuth 2.0 Authorization Framework • RFC6750 – Bearer Token 사용

Page 14: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 1.0 vs 2.0

구분 OAuth 1.0 OAuth 2.0

지원범위 웹 애플리케이션에 초점 다양한 애플리케이션 지원

요청방식 토큰요청시 암호화된 서명 사용 서명없이 HTTPS로 요청가능

토큰유효기간 Access Token의 유효기간 없음 (서비스 제공자가 선택적 구현)

Access Token의 유효기간 설정 가능

인증모델 3-legged 모델 3-legged, 2-legged 등 다양한 방식 가능

인증서버 인증서버에 대한 스펙 없음 인증서버와 API 서버 분리 및 다중화 가능

용어 개념 분리

사용자 User Resource Owner

써드파티앱 Consumer

Public Client (웹 브라우저, 써드 파티앱 등)

Confidential Client (신뢰 가능한 앱 등)

서비스제공자 Service Provider

Authorization Server

API Server

Page 15: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 2.0 인증 방식

인증모델 클라이언트 구분 인증방식 설명

3-legged

Public Client용 Implicit Code Grant OAuth 1.0a와 유사한 토큰을 이용해 인증

Confidential Client용 Authorization Code Grant 웹서버 API 호출

2-legged

Confidential Client용 Password Credentials Grant 클라이언트에 id/pw 저장해서 접근토큰 요청

Confidential Client용 Client Credentials Grant id와 secret 값으로 인증

Page 16: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 1.0a 인증 예제

네이버 카페 API 활용

Page 17: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 네이버 OAuth1.0a 예제 흐름

1. 인증시작 2. 회원 로그인 3. 접근토큰획득 4. API 호출

Page 18: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 1. 애플리케이션 등록

Page 19: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

1. commons-codec-1.3.jar 2. commons-httpclient-3.0.1.jar 3. signpost-core-1.2.1.2.jar 4. signpost-commonshttp4-1.2.1.2.jar

2. 필수 라이브러리

아래 jar 파일들을 안드로이드 프로젝트의 libs 폴더에 복사

Page 20: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

<uses-permission android:name="android.permission.INTERNET"/>

3. 안드로이드 퍼미션 설정

Page 21: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".GoogleOAuthMain" >

<TextView

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:text="@string/hello_world" />

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_above="@+id/textView1"

android:layout_centerHorizontal="true"

android:text="Start Naver OAuth" />

<WebView

android:id="@+id/webview"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:visibility="invisible"/>

</RelativeLayout>

4. 화면 구성

인증 로그인 화면을 띄우기 위해 WebView를 invisible 상태로 추가함

Page 22: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

String consumerKey = “??????????"; // 컨슈머키 String consumerSecret = “???????????";//컨슈머시크릿 String requestTokenUrl = "https://nid.naver.com/naver.oauth?mode=req_req_token"; //요청토큰URL String accessTokenUrl = "https://nid.naver.com/naver.oauth?mode=req_acc_token"; // 접근토큰URL String authorizeUrl = "https://nid.naver.com/naver.oauth?mode=auth_req_token";//인증 URL String request_token; // 요청토큰 String request_token_secret; // 요청토큰 시크릿 String oauth_token; // 인증된 요청토큰 String oauth_verifier; // 인증된 요청토큰 검증값 String oauthUrl; // 접근토큰 파싱을 위한 URL String access_token; // 접근토큰 String access_token_secret;//접근토큰 시크릿 OAuthConsumer consumer; // OAuth 컨슈머 객체: 토큰값 저장 및 서명값 생성 OAuthProvider provider; // OAuth 프로바이더 객체: 토큰 요청 및 수신 TextView tv; WebView webview;

5. Activity 변수 선언

컨슈머정보, 토큰값, OAuthConsumer, OAuthProvider, WebView, TextView 선언

Page 23: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 6. 버튼을 클릭하면

consumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret); provider = new CommonsHttpOAuthProvider(requestTokenUrl, accessTokenUrl, authorizeUrl); try { // 요청토큰을 서버에 요청해, 로그인화면 URL, 요청토큰, 요청토큰시크릿 값을 추출 oauthUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND); request_token = consumer.getToken(); request_token_secret = consumer.getTokenSecret(); } catch (Exception e) { e.printStackTrace(); }

1) consumer, provider 초기화후 “요청토큰”을 요청함 2) 이때 provider.retrieveRequestToken 호출시 콜백URL에 OAuth.OUT_OF_BAND로 세팅해야 WebView에서 접근토큰값을 받아 처리할 수 있음

Page 24: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 6. 버튼을 클릭하면

webview = (WebView)findViewById(R.id.webview); // 자바스크립트를 활성화해야 로그인 페이지가 작동함 webview.getSettings().setJavaScriptEnabled(true); webview.setVisibility(View.VISIBLE); webview.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } }); // setWebView webview.loadUrl(oauthUrl);// 인증 페이지 로딩

3) WebView를 보이게 하고 onPageFisihed를 구현 4) WebView가 초기화 되면 로그인페이지를 로딩하게함

Page 25: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 7. oauth_token, oauth_verifier 파싱

//onPageFinished로 넘어오는 URL에서 oauth_token, oauth_verifier 파싱 private boolean processUrl(String url) { for (String param: url.split("&")) { String name = param.split("=")[0]; String value = param.split("=")[1]; if(name.equals("oauth_token")) oauth_token = value; if(name.equals("oauth_verifier")) oauth_verifier = value; } return (oauth_token!=null && oauth_verifier!=null); }

onPageFinished로 넘어오는 URL에서 oauth_token, oauth_verifier 파싱 함수 구현

Page 26: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 8. onPageFinished에서 접근토큰 요청

// oauth_token, oauth_verifier 파싱에 성공하면 접근토큰 요청 if(processUrl(url)) { try { provider.retrieveAccessToken(consumer, oauth_verifier); access_token = consumer.getToken(); access_token_secret = consumer.getTokenSecret(); webview.setVisibility(View.INVISIBLE); // WebView는 안보이게 함 getMyCafeList(); // 접근토큰을 이용해 카페 목록조회 API 호출 } catch (Exception e) { e.printStackTrace(); }

1) oauth_token, oauth_verifier 파싱에 성공하면 접근토큰 요청 2) WebView는 안보이게 함 3) 접근토큰을 이용해 카페목록 API를 호출 (별도 구현)

Page 27: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 9. 카페목록 API 호출

1) Consumer에 접근토큰, 접근토큰시크릿 값을 세팅해 sign한 다음 HTTP요청에 포함 2) 결과로 넘어오는 XML을 InputStream으로 받아 출력함

private void getMyCafeList() { String apiUrl = "http://openapi.naver.com/cafe/getMyCafeList.xml"; consumer.setTokenWithSecret(access_token, access_token_secret); HttpParams params = new BasicHttpParams(); HttpRequestBase httpRequest = null; StringBuilder result = new StringBuilder(); try { httpRequest = new HttpGet(apiUrl); httpRequest.addHeader("Content-Type", "application/xml"); consumer.sign(httpRequest); HttpClient httpClient = new DefaultHttpClient(params); HttpResponse httpResponse = httpClient.execute(httpRequest); HttpEntity entity = httpResponse.getEntity(); // XML Response 처리 InputStream is = entity.getContent(); InputStreamReader in = new InputStreamReader(is, "UTF-8"); // UTF-8로 read final char[] buffer = new char[0x10000]; int ch; while((ch=in.read(buffer, 0, buffer.length))!=-1) { if(ch>0) result.append(buffer, 0, ch); } is.close(); webview.setVisibility(View.INVISIBLE); tv.setText(result.toString()); } catch (Exception e) { e.printStackTrace(); } }

Page 28: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 2.0a 인증 예제

구글 TASK API 활용

Page 29: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

1. 인증시작 2. 회원 로그인 3. 접근토큰획득 4. API 호출

구글 OAuth2.0 예제 흐름

Page 30: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 2.0a 인증 예제

구글 TASK API 준비

Page 31: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 1. 구글API Console에 프로젝트 개설

Page 32: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 2. 구글 API 선택

Page 33: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 3. 구글 API 약관 동의

Page 34: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 4. 프로젝트 ID 설정

Page 35: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 5. OAuth 2.0 Client ID 생성 시작

Page 36: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 6. OAuth 2.0 Client ID 기본 정보

Page 37: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 7. 클라이언트 서명 생성

1) cmd 2) cd .android 3) "C:\Program Files\Java\jre7\bin\keytool" -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android 4) SHA1의 값을 복사

Page 38: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 9. OAuth 2.0 Client ID 생성

Page 39: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 10. OAuth 2.0 Client ID 생성 완료

Page 40: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 2.0a 인증 예제

구글 TASK API 활용앱 개발

Page 41: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

1. google-api-client-1.4.1-beta.jar 2. google-api-client-googleapis-1.4.1-beta.jar 3. guava-r09.jar // HTTP 처리 4. jackson-core-asl-1.9.9.jar // JSON 처리

1. 프로젝트 기본 설정

2) 아래 jar 파일들을 안드로이드 프로젝트의 libs 폴더에 복사

1) 안드로이드 퍼미션, 화면 구성은 Naver OAuth와 동일함

Page 42: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

// 구글 API Console에 등록한 클라이언트 ID값 설정 String CLIENT_ID = “?????????????.apps.googleusercontent.com"; String API_KEY = “????????????????????????????????"; // API Key 값 String CLIENT_SECRET = ""; // 클라이언트 시크릿 값은 비워둠 (사용안함) // Task API를 호출하기 위한 SCOPE, URL값 String SCOPE = "https://www.googleapis.com/auth/tasks"; String ENDPOINT_URL = "https://www.googleapis.com/tasks/v1/users/@me/lists"; String REDIRECT_URI = "http://localhost"; String oauthUrl; // 요청URL

2. Activity 변수 선언

컨슈머정보, SCOPE, API키, TASK API 요청 URL 변수 설정

Page 43: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

final WebView webview = (WebView)findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); // 자바스크립트를 활성화해야 로그인 페이지가 작동함 webview.setVisibility(View.VISIBLE); // 인증 URL 값을 획득함 oauthUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID, REDIRECT_URI, SCOPE).build(); webview.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } }); // setWebView webview.loadUrl(oauthUrl);// 인증 페이지 로딩

3. 버튼 클릭시

1) 웹뷰를 초기화하고 보이도록 설정 2) 인증 URL값 획득 3) onPageFinished 구현 4) 인증페이지 로딩

Page 44: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

// 접근 토큰 요청 준비 JacksonFactory jsonFactory = new JacksonFactory(); // JSON 처리 HttpTransport transport = new NetHttpTransport(); // HTTP처리 String code = url.substring(REDIRECT_URI.length()+7,url.length()); // 접근 토큰 요청시 넘길 코드값 AccessTokenResponse accessTokenResponse; // 접근 토큰 요청 객체 생성

4. onPageFinished 구현

1) 접근 토큰 요청 준비

Page 45: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

try { // 접근 토큰 요청 accessTokenResponse = new GoogleAuthorizationCodeGrant( transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, code, REDIRECT_URI).execute(); // 접근 토큰 요청을 활용한 TASK API 호출 GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource( accessTokenResponse.accessToken, transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, accessTokenResponse.refreshToken); HttpRequestFactory rf = transport.createRequestFactory(accessProtectedResource); GenericUrl endPoint = new GenericUrl(ENDPOINT_URL); try { HttpRequest request = rf.buildGetRequest(endPoint); HttpResponse response = request.execute(); String str = response.parseAsString(); webview.setVisibility(View.INVISIBLE); tv.setText(str); } catch (IOException e) { e.printStackTrace(); } } catch (IOException e1) { e1.printStackTrace(); }

4. onPageFinished 구현

2) 접근 토큰 요청 3) Task API 호출

Page 46: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스

감사합니다.

Page 47: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 [표-1]리퀘스트 토큰 매개 변수

- 리퀘스트 토큰을 요청하기 위해서는 아래와 같은 매개변수를 전달해야 함 - 이때 서비스 프로바이더로 보내는 요청이 위변조되지 않았다는 무결성을 보장하는 서명이 필

요: oauth_signature - 서명을 생성하기 위한 방법은 oauth_signature_method로 지정 - 서명을 생성하기 위한 필요한 값으로 oauth_consumer_key(컨슈머만 알고 있는 비밀 코드)

를 비롯해 동적인 값을 생성하기 위해 oauth_nonce, oauth_timestamp 값을 포함

매개변수 설명

oauth_callback

Service Provider가 인증을 완료한 후 리다이렉트할

Consumer의 웹 주소. 만약 Consumer가 웹 애플리케이션이

아니라 리다이렉트할 주소가 없다면 소문자로 'oob'(Out Of

Band라는 뜻)를 값으로 사용한다.

oauth_consumer_key Consumer를 구별하는 키 값. Service Provider는 이 키

값으로 Consumer를 구분한다.

oauth_nonce

Consumer에서 임시로 생성한 임의의 문자열.

oauth_timestamp의 값이 같은 요청에서는 유일한 값이어야

한다. 이는 악의적인 목적으로 계속 요청을 보내는 것을 막기

위해서이다.

oauth_signature

OAuth 인증 정보를 암호화하고 인코딩하여 서명 값. OAuth

인증 정보는 매개변수 중에서 oauth_signature를 제외한

나머지 매개변수와 HTTP 요청 방식을 문자열로 조합한

값이다. 암화 방식은 oauth_signature_method에 정의된다.

oauth_signature_method oauth_signature를 암호화하는 방법. HMAC-SHA1, HMAC-

MD5 등을 사용할 수 있다.

oauth_timestamp 요청을 생성한 시점의 타임스탬프. 1970년1월 1일 00시 00분

00초 이후의 시간을 초로 환산한 초 단위의 누적 시간이다.

oauth_version OAuth 사용 버전. 1.0a는 1.0이라고 명시하면 된다.

Page 48: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 [표-2]억세스 토큰 매개 변수

- 억세스 토큰은 사용자가 OAuth 인증을 할 때마다 변경되며, 사용자가 언제라도 제거할 수 있고 유효 기간도 있음 (유효 기간은 오픈 API 제공자에 따라 선택적으로 구현)

매개변수 설명

oauth_consumer_key Consumer를 구별하는 키 값. Service Provider는 이 키

값으로 Consumer를 구분한다.

oauth_nonce

Consumer에서 임시로 생성한 임의의 문자열.

oauth_timestamp의 값이 같은 요청에서는 유일한 값이어야

한다. 이는 악의적인 목적으로 계속 요청을 보내는 것을 막기

위해서이다.

oauth_signature

OAuth 인증 정보를 암호화하고 인코딩하여 서명 값. OAuth

인증 정보는 매개변수 중에서 oauth_signature를 제외한

나머지 매개변수와 HTTP 요청 방식을 문자열로 조합한

값이다. 암화 방식은 oauth_signature_method에 정의된다.

oauth_signature_method oauth_signature를 암호화하는 방법. HMAC-SHA1, HMAC-

MD5 등을 사용할 수 있다.

oauth_timestamp 요청을 생성한 시점의 타임스탬프. 1970년1월 1일 00시 00분

00초 이후의 시간을 초로 환산한 초 단위의 누적 시간이다.

oauth_version OAuth 사용 버전

oauth_verifier

Request Token 요청 시 oauth_callback으로 전달받은

oauth_verifier 값이다. oauth_verifier는 서버에서 생성한

무작위 문자열로, 앞 단계에서 누군가 oauth_token을

알아내 해킹을 시도하는 것을 막을 수 있게 해 준다

oauth_token Request Token 요청 시 oauth_callback으로 전달받은

oauth_token 값

Page 49: 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API

제13회 한국자바개발자 컨퍼런스 OAuth 서명 생성 방식

- HMAC_SHA1 방식 : 대칭 키 방식이라 연산 비용이 크지 않고 쉽게 서명을 할 수 있기 때문에 많이 사용되고 있다.

네이버를 포함한 많은 서비스에서 HMAC_SHA1 방식을 기본으로 지원한다. (HMAC: Hash based Message Authentication Code) - RSA_SHA1 방식 : 비대칭 키로 서명을 하고 오픈 API 제공자도 클라이언트 서비스의 Private Key를 알 수 없기

때문에 더 안전하지만 Private, Public Key를 생성하고 등록하는 등 쓰기 복잡하고 연산에 부가적인 비용이 들어간다.

- PLAINTEXT 방식 : 아무런 보안책을 제공하지 않으므로 HTTPS와 같은 채널에서만 써야 한다.