인트로
순서
- OAuth Application 등록하기
- client_id client_secret 발급받기
- code 발급받기
- access_token발급
- 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 " 이라는 문자열 뒤에 토큰만 포함해서 보내야 정상적으로 동작함
- 위와같이 "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
오오쓰!! 입문자를 위한 기본 필독서