겁나 빠른 웹 레시피

구글 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. 악당이기자
    본 강의 6번 영상부터는 어쩔 도리 없이 그냥 그렇게 됐습니다. ㅎㅎ
  2. jeisyoon
    2021.07.11 Oauth 2.0 in Google API - OK
    복습하고 갑니다. 감사합니다.
  3. token123
    좋은 강의 감사합니다.
    그런데 한가지 궁금한 것이 있습니다.
    매번 Access Token을 얻기 위해 사용자의 동의를 받고 code를 얻어야 하는지,
    아니면 code를 DB 같은 곳에 저장하고 토큰이 필요할 때마다 꺼내쓰는지가 궁금합니다.
    실제로는 어떤식으로 운용되는지요?
  4. Jeff
    이 게시물 아래 댓글에 광고있습니다. 확인부탁드려요.
  5. OAuth 공부 중
    정말 최고네요. 감사합니다!
  6. 조현철
    Firebase접근시 Kakao 토큰을 사용하는 절차가 이해가안되서 검색하다 흘러왔네요. 좋은강의 감사드립니다
  7. intagi
    안녕하세요 , 진행하다 막히는 부분이 있어서 질문드립니다

    제 프로젝트 jsp페이지에서 코드를 얻어오는 (동영상 단계 5 코드획득절차)과정을 하고 있는데

    구글 계정인증후 계정에 엑세스 허가창이 나오지 않고

    확인되지 않은 앱이라는 에러페이지가 뜹니다

    계속 안되서 코드를 얻어올수가 없네요 ㅜㅜ

    어떻게 하면 좋을까요?
  8. w0w6w4@gmail.com
    말씀하시는 속도가 딱 제스타일입니다.
  9. Jeff Sa
    짝짝짝!!!
    이해되기 쉽게 충분히 잘 설명해 주셨어요!!
  10. Dong Jin Lee
    완료!
  11. 만두
    authorization code
    access token
    refresh token

    이 세가지는 클라이언트 로그인 DB에다가 저장해놓고 사용하시는가요??
    authorization code 은 1회성이라 DB에 넣을 필요가 없을라나..?
  12. 만두
    안녕하세요 정말 좋은 정보 감사합니다!

    덕분에 개념을 확 깨우쳤습니다!

    질문 드릴것이 있는데 혹시, 사용하시는 에디터 이름좀 알 수 있을까요??
  13. cha11enge
    그럼 이것을 logout 할때는 어떻게 하나요??
  14. 세실리아
    정보 보면 닉네임, 이메일 등 정보 볼수있어여
    대화보기
    • 이잉
      완벽한 보안은 원래 없어요.

      아니면 네이버에서 왜 가끔 로그인할 때 경고하는 문구를 띄어주는지 잘 생각해보셔요 ㅋ
      대화보기
      • 이잉
        두 개의 컴퓨터 A, B가 있을 때
        A 컴퓨터로 네이버에 ID_A라는 아이디로 로그인했습니다. 그 후,
        B 컴퓨터로 네이버에 ID_B라는 아이디로 로그인했습니다.
        그럼 A는 로그아웃 되나요?

        질문자님께서는 지금 이런 질문을 하고 계십니다.
        대화보기
        • 사쿠
          OAuth를 이용해서 사용자의 구글 아이디를 혹시 가져올 수는 있나요?
        • access token을 구글에서 발행할때 시간을 정할 수 있습니다.
          access token 시간을 설정할 수 있는데 이건 구글 사이트 참고해보시면 됩니다.
          facebook 도 마찬가지입니다.
          대화보기
          • 잉여
            아래 oauth 헛점이라고 작성하신분..
            그런 피싱사이트는 막는 방법이 없다고 생각되네요... dns까지 만들어다가 네이버나 구글도메인 등록해놓고 로그인페이지 카피해서 아이디 패스워드 뽑아먹은뒤 로그인 연결해주는 사이트들도 있는데.. 사용자가 이 도메인이 이 ip가 맞나 확인하는게 아닌이상.. 수상한사이트에서 로그인해서는 안되겠죠...
            사용자의 보안이슈는 사용자가 똑똑해지는것밖엔 답이없는듯...
          • ㅇㅇ
            id/pw를 입력하는 페이지의 SSL을 확인하면 되지 않을까요?
            대화보기
            • 맥북초보
              정말 감사합니다. oauth 입문용으로 최고의 자료네요.
            • 초보요
              질문이요..
              구글 로그인 api를 연동하고 싶은데 정확한 api명이 뭔가요?
              리서치해도 잘 모르겟네요ㅜㅜ
            • 초보개발자
              강좌 감사합니다.
            • 파인만씨는농담을좋아해
              감사합니다~
            • oauth^^
              제 생각에는 oauth 에 큰 보안(?) 관련 이슈가 있다고 생각합니다.
              기술적 허점이 아닌 일반 웹사용자의 허술함 입니다.

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

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

              이러한 문제 때문에, 무언가 resource owner의 사용측면에서의 부주의함을 줄일 수 있는 방법이 고안되어야 한다고 생각합니다.
            • 액세스 토큰은 만료시간이 있습니다
              사용자가 앱을 사용하다가 액세스토큰의 만료시간 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 자세히 보기