OAuth 찍먹해보기 (with POSTMAN실습 )

Sorbet·2021년 5월 19일
15

인트로

  • Authorizing OAuth Apps 이거 따라한건데
  • POSTMAN으로 간단히 실습하면서 이해해보면.. 생각보다 쉽다
  • 이론적인 지식은 이전 글 참조
    : https://velog.io/@d-h-k/OAuth-JWT-제발-떠먹여줘
  • 참고로 OAuth가 살짝 프론트랑 연동되어야 하는 부분이 있어서
    • 일단 Postman으로 느낌좀 잡고
    • 자바 코드는 그냥 이 과정을 자동화시키는것 뿐
    • 옵션으로 jwt를 쓸지 그냥 세션을 쓸지는 백엔드 개발자 마음
    • 오어쓰 이해를 위한 징검다리 정도로 생각해줘요!

순서

  1. OAuth Application 등록하기
  2. client_id client_secret 발급받기
  3. code 발급받기
  4. access_token발급
  5. Github API 호출하기

위 5단계 순서로 실습 진행






1) OAuth Application 등록하기

  • 먼저 깃허브에 로그인해주세요
  • 우측 상단 버튼을 눌러 settings 클릭
  • Developer settings 버튼 클릭
  • OAuth Apps 클릭하고
  • New OAuth App 버튼 클릭





2) client_id client_secret 발급받기

  • 앞에서 <New OAuth App 버튼>을 클릭힌 상태에서
  • client-id & client-secret 정보 저장하기
  • 설명
    • 1) Generate a new client secret 버튼 클릭
      : 클라이언트 시크릿을 발생하는 버튼입니다. 클릭해서 시크릿을 발행하면 사진과 같이 초록색 시크릿키가 발급됩니다.
    • 2) Client ID
      : 클라이언트의 아이디 입니다. 공개되는 정보이며 유출되도 상관없습니다. 이 github app의 고유 아이디 입니다
      • 저의 클라이언트 아이디는 앞으로 b6201~(개인마다 다름) 입니다
    • 3) Client secret
      : 클라이언트의 비밀번호이고, 유출되면 안되는 정보입니다. (저는 글 쓸때만 발급받고 이미 삭제한 키라 노출이 되도 괜찮습니다)
      • 한번 보면 나중에 다시 조회할 수 없으므로 자신만 접근할수 있는 private한 공간에 적어둡시다
      • 저의 클라이언트 시크릿은 34d2b~(개인마다 다름) 입니다!

  • 참고로 Key Delete는 Key가 두개 이상 있을때 가능합니다.
  • 앞으로 실습에서 사용할 제 시크릿키는 e31c8 입니다





3) code 발급받기

  • 공식문서
  • 아래 URL에다가 GET요청을 보내는데 몇몇 필수적인 쿼리스트링을 끼워서 보내면 적절한 응답이 옵니다
  • URL은 여기고
  • 파라미터는 여기에요
  • 필수는 아닌데, 꼭 적어줘야하는 scope까지 적어줘 보겠습니다

이제 여기서 실습을 위한 POSTMAN을 사용합니다

  • 실습을 위해서 POSTMAN에서 새로운 Collection을 만들고
  • 새로운 GET Request를 작성합니다
https://github.com/login/oauth/authorize
  • 위 URL로 GET 요청을 보내는데
  • 두가지 쿼리스트링을 추가하는데
    • client_id : 위에서 발급받은 github app의 client id 를 적어주시고
    • scope :

잘 따라오셨다면 이런화면이 떠요

  • send 보내면 HTML 문서가 날라옵니다.

  • 쉽게 보기 위해서 브라우저에 url을 복사해 붙여넣습니다

  • 대략 이런모습입니다

  • 잘 된다면 초록 버튼을 눌러서 진행(Authorization ### 버튼)

  • callback URL은 사용자가 로그인하고 Authorize버튼(초록색) 누르면 redirect해주는 URL입니다.

  • 바닥쪽에는 redirection url의 위치가 표시

https://github.com/login/oauth/authorize?client_id=당신의아이디&scope=repo:status read:repo_hook user:email
  • 모르겠으면 위에 url을 복사해서 포스트맨에 복붙

  • 다음화면은 이렇게 검정색으로 뜨는데, 잘 살펴보면 코드가 포함되어 있습니다
http://localhost:8080/auth/github/callback?code=d9ea4e3d98bd8a477bcd
  • 이렇게 해서
    : code=d9ea4e3d98bd8a477bcd
  • 위와같이 code를 얻는데 성공했습니다






4) access_token발급

  • 이제 access_token을 발급받을 차례입니다
  • 이번에는 POST 방식으로 위 URL에 리퀘스트를 보내야 합니다
  • 필수 파라미터는 3가지 인데
    • APP만들때 발급받았던 : client_id, client_secret
    • 방금전에 발급받은 : code
  • 위 3가지 파라미터를 넣어서 POST요청을 보내면

  • 정상적으로 access token 이 발행된걸 확인할 수 있습니다
access_token=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&scope=read%3Arepo_hook%2Crepo%3Astatus%2Cuser%3Aemail&token_type=bearer
  • 응답으로 돌아온 access token!!
  • 제 토큰은 gho_EUg~ 입니다





5) Github API 호출하기

  • 이제 발급받은 토큰으로 Github API를 호출해볼 시간입니다.
  • GET 요청을 보내는거고, 헤더에 포함할 정보는
    : Authorization: token OAUTH-TOKEN
    인데 아래처럼 작성하시면 됩니다
https://api.github.com/user?Authorization=token gho_EUg~(당신의 토큰)

send 버튼을 누르면 github 계정 정보를 확인할 수 있습니다

  • 다른이들의 깃헙 정보를 토큰만 가지고 알아낼 수 있습니다.

주의사항 1 쿼리스트링이 아니라 헤더에 포함

  • "token " 이라는 문자열 뒤에 토큰만 포함해서 보내야 정상적으로 동작함

주의사항 2 token만을 header에 넣어줘

  • 위와같이 "Bad credentials" 이 나오는 경우 token만을 header에 넣어줘야 동작합니다
  • 아래 부분부터는 token이 아닙니다
&scope=read%3Arepo_hook%









One more thing...


귀찮은 분들을 위한 포스트맨 링크

https://www.getpostman.com/collections/5c4b2b3f6dcf59696dcf

리뷰반영 : Authentication vs Authorization

인증(Authentication)

  • 신분(identification)을 확인, 신분증과 유사

암호화가 필요한 이유

  • 비밀번호와 같은 개인정보는 비밀번호 그대로 DB에 저장할 경우 해킹당하면 유저의 비밀번호도 그대로 노출되므로, 평문(varchar)으로 DB에 저장하지 않는다.

단방향 해쉬

  • 원본 메세지를 Hash함수로 변환하여 암호화하는데
  • 원본 메세지를 알면 Hash함수를 통해 암호화된 메세지를 만들수 있지만
  • 암호화된 메세지로는 원본 메세지를 구할 수 없어 단방향성(one-way)임
  • 같은 알고리즘으로 다시 해싱하면 항상 같은 결과가 나오므로 무차별 공격기법중 하나인 Rainbow Table공격에 취약

Salting

  • 실제 비밀번호 이외에 추가적으로 난수값을 더해 해시값을 계산하는 방법
  • 이게 왜 Salt(소금)ing이나면, 우리가 고기를 구울때 그 위에 소금을 얹어서 굽는데
    • 원본 데이터에(고기)에다가 난수(소금)를 더해 굽는다(Hash화)는거랑 비슷해서

이외

  • Key Stretching: 해쉬한 값에다가 한번 더 해쉬화하는거, 이런식으로 3번 4번... 해쉬함수 돌리는 기법을 총칭
  • bcrypy: Saltion and Key Stretching을 지원하는 라이브러리






인가(Authorization)

  • 어떤 정보까지 접근할수 있는가 , 접근제한구역(Authorization person only를 확인)
  • 위 사진에서는 OS 의 그것과 비슷하다

JWT(Json Web Token)

  • 제이슨으로 구성된, 웹에서 쓰는, 토큰

토큰

  • 토큰은 이미 없어진지 오래 되었고 동전도 점점 없어지고 있어서 토큰의 의미를 직관적으로 이해하기가 어렵게 되었지만 의미 자체는 '권리'입니다.
  • 시내버스를 한번 탈수 있는 토큰(권리)
  • 토큰은 본인 확인 수단입니다
    • 로그인을 할 때 id와 pw를 넣고 로그인을 하면
    • 서버가 id와 pw를 확인해서 맞을때만 사용자가 유효한 사용자라는 인정하고, 그 권리를 토큰에 담아 발행 해줍니다.
    • 그러면 사용자들은 이 토큰을 가지고 해당 사이트의 여러 버스에 해당하는 서비스들을 이용 할 수 있는 거죠!

Access Token을 사용하는 이유

  • 무거운 bcrypt방식을 사용하지 않고, 간단한 해쉬만 있으면 됨
  • 실제 id와 비밀번호가 쿠키와 같은 클라이언트 서버에 저장되지 않음
  • Token은 특정 서버에 사용되기 때문에 다른 사이트에서는 사용되지 않음

Authentication VS Authorization

Authentication : confirms users are who they say

  • 컴퓨터앞에 앉은 사람이 누구인지 확인하기 위해 ID/PASSWORD 넣어서 인증해주는 행위가 바로 Authentication

Authorization : Gives user permission to access a resource

  • 누구인지 확실하게 아는 상태에서 무슨일을 할수있고 없는지를 , 접근할수 있는 리소스를 나눠주는거지

진짜 끝

이런 아폴로 불량식품 같은 정보글 말고, 여기있는 한우 1++등급 채끝스테이크 같은 글을 읽으세요! 두번 읽어요
: https://d2.naver.com/helloworld/318732

profile
Sorbet is good...!

9개의 댓글

comment-user-thumbnail
2021년 5월 19일

오오쓰!! 입문자를 위한 기본 필독서

1개의 답글
comment-user-thumbnail
2021년 5월 19일

어제 액세스토큰 얻은것 까지했다고 말씀드리고 어떻게해야하는지 몰랐는데
동포스트 보고 Authorization이라는 헤더 값에다가 토큰을 넣어줘야한다는걸 배워서 덕분에 마무리 잘했습니다~ ㅎㅎ

1개의 답글
comment-user-thumbnail
2021년 5월 20일

리뷰사항 : 어써라이제이션 어쏀티케이션 차이점

1개의 답글
comment-user-thumbnail
2021년 6월 2일

덕분에 모든건 준비됏습니다.. 부먹만 남았네요 감사합니다..

1개의 답글
comment-user-thumbnail
2022년 7월 7일

감사합니다

답글 달기