OAuth 2.0

OAuth 2.0 이란?

OAuth 2.0은 인가(Authorization)를 위한 산업표준 프로토콜이다. 2006년에 만들어진 OAuth 프로토콜을 대체한다. OAuth 2.0은 웹 애플리케이션, 데스크톱 애플리케이션, 휴대폰, IoT 장비 등을 위해 특정 인가 절차를 제공하면서 클라이언트 개발자 단순성에 집중한다. 이 표준과 이에 대한 확장은 IETF OAuth Working Group에서 개발되고 있다.

(출처: https://oauth.net/2)

용어 설명

  • 인가(Authorization): 인증된 클라이언트에게 허가된 권한을 부여하는 행위
  • 인증(Authentication): 클라이언트가 자신이 주장하는 신분을 증명하는 행위
  • 인가 서버(Authorization Server): 리소스주인 인증에 성공하고 권한을 얻은 후 클라이언트에게 엑세스 토큰(Access Token)을 발급하는 서버
  • 리소스 서버(Resource Server): 보호된 자원(예, 사용자 정보)을 호스팅하는 서버로, 엑세스 토큰을 사용한 요청을 받아 보호된 자원을 응답할 수 있다.
  • 리소스 주인(Resource Owner): 보호된 자원에 대한 접근 권한을 부여할 수 있는 객체로, 리소스주인이 사람일 경우 앤드유저(end-user)라고 한다.
  • 클라이언트(Client): 리소스주인을 대신하여 권한이 있는 보호된 자원을 요청하는 애플리케이션

인가 승인 방식

1. Authorization Code

권한 코드(Authorization Code)클라이언트리소스 주인 사이의 중개 역할을 하는 인가 서버를 통해 얻을 수 있다. 리소스 주인으로부터 직접 인가 요청을 받는 대신, 클라이언트리소스 주인RFC 2616에 정의된 에이전트(예, 웹 브라우저, 모바일 앱 등)를 통해 인가 서버로 보내고, 권한 코드와 함께 다시 클라이언트로 보냅니다.

리소스 주인권한 코드와 같이 클라이언트로 보내기 전에, 인가 서버리소스 주인을 인증하고 권한을 얻는다. 리소스 주인은 오직 인가 서버를 통해 인증을 하므로 클라이언트리소스 주인의 자격증명에 대해 절대로 클라이언트와 공유되지 않는다.

권한 코드는 중요한 보안 이점을 제공하는데, 클라이언트를 인증하는 기능과 리소스 주인이 사용하는 에이전트(예, 웹 브라우저)에 직접 액세스 토큰을 전달하지 않고 직접 클라이언트에 전송한다.

Authorization Code Grant Flow (출처:  https://oauthlib.readthedocs.io/en/latest/oauth2/grants/authcode.html )

 

2. Implicit

암시적 승인(Implicit Grant) 방식은 Authorization Code Grant 방식을 단순화한 방식이다. 자바스크립트 같은 스크립트 언어를 사용하여 웹 브라우저에서 구동되는 클라이언트에 최적화되었다. 암시적 승인 절차에서는 권한 코드를 클라이언트에게 발급하는 대신, 리소스 주인의 인가 결과로써 액세스 토큰이 직접 발급된다. 이 권한 유형은 엑세스 토큰을 얻기 위한 중간 자격 증명(예, 권한 코드)이 발급 되지 않기 때문에 암시적 승인이라고 한다.

암시적 승인 절차에서 엑세스 토큰을 발행할 때, 인가 서버는 클라이언트를 인증하지 않는다. 몇몇 경우에는 클라이언트 엑세스 토큰을 클라이언트에 전달하는데 사용된 redirect_uri를 통해 클라이언트 신분을 확인할 수 있다. 엑세스 토큰은 리소스 주인이 사용자 에이전트에 접근하여 리소스 주인 또는 다른 애플리케이션에 노출될 수 있다.

암시적 승인은 엑세스 토큰을 얻는데 필요한 왕복 횟수를 줄이므로 일부 클라이언트의 응답성과 효율성을 향상시킵니다. 그러나 이러한 편리함은 10.310.16에 설명한 것 처럼 보안에 좋지 않을 수 있다.

엑세스 토큰에 대한 검증이 생략되므로 엑세스 토큰이 오용될 수 있다는 얘기.

Implicit Grant Flow(출처:  https://oauthlib.readthedocs.io/en/latest/oauth2/grants/implicit.html )

 

3. Resource Owner Password Credentials

리소스 주인 패스워드 자격증명 승인 방식이다. 일반적으로 엔드 유저의 id, password를 사용하여 직접 인가 절차를 수행하여 엑세스 토큰을 얻는 방식이다. 리소스 주인과 클라이언트 간에 높은 수준의 신뢰도가 있을 경우 사용되어야 하며, 다른 인가 승인 방식은 사용되지 않아야 한다.

이 승인 방식은 비록 클라이언트가 리소스 주인의 자격증명에 직접 접근하게 되지만, 엑세스 토큰을 얻는 한번의 요청에만 자격증명을 사용한다. 클라이언트가 리소스 주인의 자격증명을 저장할 필요성이 없고 긴 유효기간을 가진 엑세스 토큰을 받아 쓸 수 있다.

Resource Owner Password Credential Flow(출처:  https://oauthlib.readthedocs.io/en/latest/oauth2/grants/password.html )

 

4. Client Credentials

클라이언트 자격증명 인가 방식이다. 권한 범위가 클라이언트가 통제하는 보호된 자원에 제한될 때 또는 보호된 자원이 이전에 인가 서버와 연결된 경우에 클라이언트 자격증명을 사용할 수 있다. 클라이언트 자격증명은 클라이언트가 자신을 대신해 행동할 때 또는 이전에 인가 서버와 연결된 보호자원에 접근하는 요청을 할 때 사용되는 인가 방식이다.

Client Credentials Grant Flow (출처:  https://oauthlib.readthedocs.io/en/latest/oauth2/grants/credentials.html )


풀어쓰는 OAuth 2.0 인가 절차 이야기

우리가 흔히 경험하는 OAuth 2.0 예는 대표적으로 소셜 로그인을 통한 제 3의 앱 사용이 있다.

예를 들어 애니팡 모바일 앱 게임을 하는데 카카오톡 계정으로 로그인하는 것이다.

이 과정을 조금 풀어쓰면 다음과 같다.

  1. 카카오톡 인가 서버 존재
  2. 카카오톡 계정정보 담당하는 API 서버(리소스 서버) 존재
  3. 써드파티 앱인 애니팡은 클라이언트로써 인가 서버에 클라이언트 등록을 한 상태
  4. 리소스 주인인 일반 사용자가 애니팡의 카카오계정으로 로그인 버튼 클릭
  5. 인가 서버가 설정한 혹은 애니팡이 클라이언트 등록시 설정한 승인타입(Grant Type)에 따라 인가 절차 수행
  6. 애니팡은 인가 서버가 사용하는 Authorization Endpoint(예, https://dev.kakao.com/oauth/authorize)로 3번에서 등록한 client_idresponse_type 파라미터를 필수로 전송해야한다. 이 때 response_type은 표준에서 정한 문자열(code, token 등) 혹은 인가 서버response_type에 설정한 값을 입력해야하며, redirect_uri를 선택적으로 파라미터에 추가할 수 있다.
    (https://dev.kakao.com/oauth/authoirze?client_id=anypang-client-id&response_type=code&redirect_uri=https://foward.anypang.com/game/main)
  7. 인가 서버가 설정한 사용자 인증(Authentication) 절차를 거쳐(예, 카카오톡 로그인, 제공 권한 동의) 인증한다.
  8. 인증이 완료되면 access_token을 발급하며 애니팡 게임 메인화면(redirect_uri에서 설정)으로 이동한다.
  9. 애니팡은 카카오톡 계정 API (리소스 서버)에 사용자 프로필, 친구목록 등을 조회하여 게임 화면에 표시하는데 사용한다.

위의 이야기, 절차 등은 Authorization Grant 방식, 인가서버 설정 방식에 따라 달라질 수 있다. (예시는 Implicit 방식으로 response_type=token 으로 동작한다, 인가코드에 대한 추가 승인 없이 사용자 인증이 완료되면 바로 access_token 발급하는 방식이다.)


참조

jEnv로 자바 환경 세팅

Java 설치

> brew search jdk

==> Formulae
openjdk ✔                                                              openjdk@11 ✔
==> Casks
adoptopenjdk                       adoptopenjdk12-openj9              adoptopenjdk14                     adoptopenjdk8-openj9-jre
adoptopenjdk10                     adoptopenjdk12-openj9-jre          adoptopenjdk14-jre                 adoptopenjdk8-openj9-jre-large
adoptopenjdk11                     adoptopenjdk12-openj9-jre-large    adoptopenjdk14-openj9              adoptopenjdk8-openj9-large
adoptopenjdk11-jre                 adoptopenjdk12-openj9-large        adoptopenjdk14-openj9-jre          adoptopenjdk9
adoptopenjdk11-openj9              adoptopenjdk13 ✔                   adoptopenjdk14-openj9-jre-large    jdk-mission-control
adoptopenjdk11-openj9-jre          adoptopenjdk13-jre                 adoptopenjdk14-openj9-large        oracle-jdk
adoptopenjdk11-openj9-jre-large    adoptopenjdk13-openj9              adoptopenjdk8 ✔                    oracle-jdk-javadoc
adoptopenjdk11-openj9-large        adoptopenjdk13-openj9-jre          adoptopenjdk8 ✔                    sapmachine-jdk
adoptopenjdk12                     adoptopenjdk13-openj9-jre-large    adoptopenjdk8-jre
adoptopenjdk12-jre                 adoptopenjdk13-openj9-large        adoptopenjdk8-openj9

> brew install openjdk
> brew cask install adoptopenjdk8

jEnv 설치

> brew install jenv

> echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
> echo 'eval "$(jenv init -)"' >> ~/.zshrc
> source ~/.zshrc

JDK jEnv 설정

# adoptopenjdk 8
> jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

# openjdk (13)
> jenv add /usr/local/opt/openjdk

# 확인
> jenv versions
system
openjdk64-1.8.0.242
openjdk64-13.0.2

글로벌 Java 버전 설정

$ jenv global openjdk64-13.0.2

로컬 Java 버전 설정 (디렉토리별)

$ jenv local openjdk64-1.8.0.242

쉘 Java 버전 설정

$ jenv shell openjdk64-13.0.2

올초부터 make 님의 기반기술세미나 에 참가하여 공부를 하다보니

새해 계획의 꾸준한 블로그 업데이트와 알고리즘 코딩 및 깃헙 커밋, 오픈소스 컨트리뷰트 등은 거의 하질 못하고 있습니다.

(결혼 준비에 게임도 꾸준히 하는건 비밀)


기반기술세미나에서는 비전공자 개발자로서 부족함을 느꼈던 

CS Fundamental (어셈블리, 운영체제, 네트워크, 시스템 프로그래밍, 자료구조, 리눅스 등)을 배우고 있어요.


매주 토,일 2시간씩 하기에 이 모든 것을 놀면서 하려니 벅차네요.

(어셈블리 서적만 3권에 관련 아티클 2~3개 읽어야 하고 ARM CPU 설계도에 C언어, TCP/IP 강의 등....)


일단 9월까지 예정된 세미나 잘 듣고, 연말에는 복습하면서 블로그에 정리할 생각입니다.


사실 4월까지 하기로 했었는데 멤버들 진도가 좀 늦어서 9월까지 하기로 됐거든요. 

근데 제가 4월에 끝날 줄 알고 6~7월 스프링 스터디를 잡아버려서 이중고지만.. 둘다 잘 해보겠습니다.


스프링 스터디는 토비의 스프링 3.1 요약 발표 형식이라, 나중에 스터디 끝나고 스프링 블로그 글도 잘 정리해서 올리겠습니다.


그리고 내년에 2년차 개발자가 되는데, 3년차까지 1년 남았네요.

올해는 기본기를 탄탄히 했으니 내년에 알고리즘과 개인 프로젝트를 통해 더 레벨업 할 생각입니다.



저도 여러 좋은 분들의 블로그에서 도움을 받았듯이, 부족하지만 이 곳에서 제 글들도 누군가에게 도움이 되었으면 합니다.

부족함이 많은 글들이라 부끄럽지만 더 노력하여 개선해가겠습니다.


본 내용은 2가지 책의 내용을 요약한 것입니다. 참고하세요





  


"특히 프로젝트가 서쪽으로 간 까닭은" 은 꼭한번 읽어보시라고 권해드립니다.


  • 리더가 당신에게 무엇을 하고 있는지 묻기 전에 어떤 일을 하고 있는지 먼저 말해 주는 것에 주저하면 안됩니다. 자주 피드백 합시다.
  • 모형, 프로토타입, 스토리보드를 고객에게 미리 제공하여 고객이 원하는 바를 조기에 파악해야 합니다. - 밀짚 인형 기법
  • 업무에 우선 순위를 매긴 후 최고 속력으로 처리가 가능한 만큼만 진행 합니다.
  • 특정 분야에 전문가가 되기 위해서 10년 법칙 1만 시간의 노력이 필요 합니다.
  • 기술적 숙련도에 도움이 되는 수요조사
    • 직원 공모 또는 취업 사이트를 분석하면 유망한 기술을 분석할 수 있습니다.
    • 해외 외주 사이트를 분석하면 유망 기술 동향을 분석할 수 있습니다. - oDesk
  • 업무와 관련된 잡지를 정기 구독 합니다. - 마이크로소프트웨어
    • 과 월호를 찾아봅니다. 정독합시다.
    • 뉴스, 특집기사 등을 주의해서 봅니다.
  • 자신의 업무에 익숙해지기 위한 반복 학습을 실행 합니다.
  • 정상을 바라보고 프로젝트 목표를 설정합니다.
  • 적정한 기간 내에 출시 할 결과물을 계획합니다.
  • 모니터를 여러 대 추가하고, 모니터의 적당한 높이 조절을 통하여 생산성을 향상시켜보도록 합니다.
  • 인체 공학적인 마우스를 이용합니다.
  • 다육이 화분을 책상 주변에 배치 합니다. - 공기 정화
  • 좋아하는 글귀와 명언을 출력하여 붙여 놓습니다.
  • 감탄을 잘합시다. - 리 액션
  • 단위 시간당 더 많은 깨달음의 순간을 경험하도록 통찰력을 키우도록 합니다.
  • 내가 할 일에 대한 목록을 정리 합니다.
    • 우선순위를 수시로 변경하도록 합니다.
    • 중요도 순으로 정리합니다.
  • 자신이 사랑하는 일을 합니다
    • 행복을 찾아라
    • 배울 수 있는 건 뭐든 배워라
    • 새로운 것을 시도하고 옛 것을 지켜라
    • 최고의 사람과 함께
    • 조언자를 찾아라
    • 자기 팀, 회사, 분야에 보답하라
    • 글쓰기, 코딩을 꾸준히 연습하라, 동료의 일 조언
    • 좋은 책을 많이 읽어라
  • 개발자로서의 첫 5년이 가장 큰 가르침을 얻는 시기입니다.
    • 한 팀의 일원으로 일하고, 동료와 정보 기술, 자산(문서, 코드, 프레젠테이션)의 공유 방법을 익힙니다.
  • 중요한 스킬을 익힙니다.
    • 4가지 이상의 언어 및 방법론
    • 람다식, 클로저등 함수형 언어 익히기
    • Jpeg. Xml, Text, Json
    • 동시에 천 명 이상 접속 가능한 서버 기술
    • 여러 명의 개발자와의 팀워크 경험
    • 다른 사람의 소스코드 분석 노하우
    • 다국어 지원 방법
  • 도메인 특성에 집중 합니다.
    • 트랜드 기술 보다 통신, 이미지 처리, 데이터베이스, 그래픽스, 알고리즘 등 기본적인 기술 원칙에 치중
  • 메이븐이 됩시다.
    • 특정 분야에 대해 방대한 지식을 갖추고 있으면서, 그 정보를 널리 공유하는 사람
  • 온라인 멘토가 됩시다.
    • 메신저, 화상 회의 등의 방법으로 정보 공유
    • 지속적인 노하우의 제공
    • 블로그, SNS의 적절한 활용
  • 비밀실험, 전혀 다른 프로젝트를 경험해봅니다.
  • 스스로 특허를 발굴 해보기
  • 전문지에 기고할 글, 백서, 기술 문서 쓰기
  • 논문 쓰기
  • 부하직원의 양성, 차세대 리더의 양성
  • 자신이 개발한 기술에 대한 유튜브 동영상을 제작하여 쇼 케이스 만들기
  • 다양한 업무 역량 배우기
    • 계획
    • 설계 기법
    • 프로그래밍
    • 디버깅
    • 테스팅
    • 공학
  • 업무 외 역량 익히기
    • 강연 능력
    • 조직 예절
    • 협상력
    • 멘토링
    • 팀워크
    • 의사 소통
    • 관리 방법
    • 리더쉽
  • Assertion의 활용
    •  논리 흐름상 반드시 만족해야 하는 과정을 코드에 넣는 것
  • 사분면 기법을 통한 업무의 관리
    • 한 축 : 급한 일 / 급하지 않은 일
    • 한 축 : 중요한 일 / 중요하지 않은 일
    • 중요성 축, 긴급성 축으로 구성
  • 감성지능의 키우기
    • 미소, 인간미, 지지 기반
    • 화를 내는 빈도를 줄입시다.
    • 객관적인 시선
    • 팀의 최선, 온화, 자기 계발
    • 긍정적인 정서
  • 소통 하기
    • 모임, 학회 참석
    • 커뮤니티 활동
  • 다른 사람들에게 대가를 바라지 않는 호의를 베풀기
  • 때론 업무 시간의 빈둥거림도 필요합니다.
    • 뉴스, 웹 서핑, 재테크
    • 게임, 안부 묻기
    • 휴식, 산책
  • IT 관련 동향 따라가기
    • Techmeme
    • Hacker News
    • Reddit Programming
    • 블로터
  • 다른 사람과 협업 하는 것은 그 노력에 숨어있는 집단지성을 증가시킵니다.
  • 팀의 상호작용과 협업을 위한 요소
    • 겸손 : 열려 있어야 한다.
    • 존중 : 능력과 업적에 감사
    • 신뢰 : 믿음
  • 실패의 경험이 없다면 충분히 혁신적인 사람이 되지 못하거나 위험을 감수하려고 하지 않게 됩니다.
  • 나의 실패를 문서로 만들자
    • 포스트모텀(Postmortem)
    • 회고록 작성
      • 요약
      • 현상의 발견
      • 원인
      • 평가
      • 문제의 해결을 위한 활동
      • 재발방지 기법
      • 배운 점
  • 당신의 약점을 드러내면 드러낼수록 당신은 더 강해집니다.
  • 당신의 팀이 가치 있고 지켜야 하는 문화를 가지는 것이 중요합니다.
  • 업무 외의 자신을 힐링하기 위한 악기를 하나 배워보도록 합시다.

출처: 개발자 자기계발 및 실력향상 노하우, http://futurewavedev.tistory.com/7


'프로그래밍 > 이야기' 카테고리의 다른 글

OAuth 2.0 정리  (0) 2021.04.28
[macOS, 맥OS] jEnv로 자바 환경 세팅  (0) 2020.06.27
글을 안 올리는 이유(변명!?)  (0) 2017.06.14

+ Recent posts