겁나 빠른 웹 레시피

구글 API를 통해서 배우는 인증 (oauth 2.0)

수업소개

API를 사용하는데 큰 걸림돌은 인증입니다. 사용자에게 최적화된 서비스를 제공하기 위해서는 그 사용자의 정보에 접근할 수 있어야 합니다. 많은 서비스가 인증을 위한 방법으로 oauth 2.0을 사용하고 있습니다. 여기서는 oauth 2.0의 원리를 알아보고, 인증에 대해서 좀 더 자신감을 가질 수 있도록 도와드립니다.  

사용기술

주요개념

API의 사용, SDK의 이용, oauth 2.0을 이용한 인증

참고

수업

수업소개

동작 메커니즘

API 접속하기

 

oauth 사용하기

 

code 획득 절차

 

token 받기

access token 사용하기

 

refresh token 사용하기

 

SDK 사용

 

예제

login.html

사용자를 Resource Server의 인증 페이지로 보내는 URL 생성

<html>
  <body>
    <a href="https://accounts.google.com/o/oauth2/v2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly&access_type=offline&include_granted_scopes=true&state=state_parameter_passthrough_value&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2FreceiveCode.php&response_type=code&client_id=3870214908-3fur6lisge1riduu6bfncvg1q15bs0k2n.apps.googleusercontent.com">구글 API를 사용할 수 있도록 허용하러 가기</a>
  </body>
</html>

receiveCode.php

Resource Server가 전달해준 Authorization code를 받아서 Access Token과 교환하기 위한 정보를 생성하는 페이지

<!DOCTYPE html>
<html>
  <body>
    <style>
      input{
        width:300px;
      }
    </style>
      <a href="login.html">login</a>
      <form action="https://www.googleapis.com/oauth2/v4/token" method="post" enctype="application/x-www-form-urlencoded">
        code : <input type="text" name="code" value="<?=$_GET['code']?>"><br>
        client_id : <input type="text" name="client_id" value="3870214908-3fur6lisge1riduu6bfncvgq15abs0k2n.apps.googleusercontent.com"><br>
        client_secret : <input type="text" name="client_secret" value="teUYcbqLdUq13UTwd90J6feK"><br>
        redirect_uri : <input type="text" name="redirect_uri" value="http://localhost:8888/receiveCode.php"><br>
        grant_type : <input type="text" name="grant_type" value="authorization_code"><br>
        <input type="submit">
      </form>

  </body>
</html>

refreshToken.php

access token 값을 새로 발급 받기 위한 방법

<!DOCTYPE html>
<html>
  <body>
    <form action="https://www.googleapis.com/oauth2/v4/token" method="post" enctype="application/x-www-form-urlencoded">
      <input type="text" name="client_id" value="3870214908-3fur6lisge1riduu6bfncvgq15bs0k1n.apps.googleusercontent.com"><br>
      <input type="text" name="client_secret" value="teUYcbqLdUqg3UTwd90J4feK"><br>
      <input type="text" name="refresh_token" value="1/Eatu7T-ge3I1ekgK3E5rv24cbZdRIH84H00W14MYZbY"><br>
      <input type="text" name="grant_type" value="refresh_token"><br>
      <input type="submit">
    </form>
  </body>
</html>

 

댓글

댓글 본문
작성자
비밀번호
  1. 파인만씨는농담을좋아해
    감사합니다~
  2. oauth^^
    제 생각에는 oauth 에 큰 보안(?) 관련 이슈가 있다고 생각합니다.
    기술적 허점이 아닌 일반 웹사용자의 허술함 입니다.

    예를 들어, 1) 악의적인 목적으로 'A'라는 사이트를 만들었습니다. 2)사이트의 기능을 이용하기 위해서 구글의 확인이 필요 하다고 알람창을 띄운다음에 구글 로그인 페이지로 이동합니다. 3)구글 페이지로 이동하는 것이 아니라 똑같이 만들어 놓은 가짜 페이지를 띄운 다음에 사용자의 구글 id/pwd를 얻을 수 있습니다.

    위 내용은 실제 외국 피싱 사이트가 많이 쓰는 방식입니다. 저도 oauth 2.0에서 resource server에서 token 정보를 가져오기 위해 redirect하는 부분에 대해서,, 피싱 사이트에 대한 피해가 많을 것 같다고 예상 했습니다.

    이러한 문제 때문에, 무언가 resource owner의 사용측면에서의 부주의함을 줄일 수 있는 방법이 고안되어야 한다고 생각합니다.
  3. 액세스 토큰은 만료시간이 있습니다
    사용자가 앱을 사용하다가 액세스토큰의 만료시간 5분이 지났다고치면
    다시 액새스 토큰을 발급받아야되는 불편함이있는데(유저가 재로그인해야됌)
    리플레시 토큰이 있으면 재로그인 과정없이 서버가 알아서 액새스토큰을 재발급해줄수있는 거같습니다
    저는 이렇게이해했어요
    대화보기
    • lowell
      감사합니다
    • 이정훈
      감사합니다 ㅠ 카카오톡과 파이어베이스 할때 다 oAuth써서 뭐지 했는데 덕분에 잘알고 갑니다
    • 이사이트 오기전까지는 문서상으로 개념잡기가 힘들었는데, 동영상으로 이렇게 상세히 설명을 해주시니 이해하는데 많은 도움이 되었습니다. 감사합니다.
    • 오은석
      aws에 이어 oauth 2.0도 잘 배우고 갑니당 ㅎㅎ
      완전 이해 잘 되네요!
    • 뭉뭉이
      2번째 봐야 머리속에서

      정리가 되는군요.. ^^;;

      감사합니다!
    • 승쭈
      감사합니다.!!!
    • 감사합니다
    • 코딩무뢰한
      안녕하세요? 많은 도움이 되고 있습니다. 궁금한 점은 client 의 서비스에 여러 resource owner가 접속하여 사용 할 경우 1번 resource owner의 동의와 client ID, secret를 통해 받은 access code는 2번 resource owner가 접속시에는 소용이 없는 것 아닌지요? 그렇다면 결국 refresh token이라는 것이 왜 필요한지 잘 모르겠습니다. 어짜피 접속시마다 access token이 새로 부여될텐데 말이죠...
      초보자의 질문이라 두서 없습니다.
    • 몽몽이
      좋은강의감사합니다~
    • yoojat
      저에게 정말 필요한 수업이었는데 ㅠㅠ 정말 감사합니다
    • eukrasie
      좋은 강의 감사히 잘 봤습니다.
    버전 관리
    egoing
    현재 버전
    선택 버전
    graphittie 자세히 보기