OAuth2

OAuth2

이용자는 내가 만든 서비스를 이용하려고 합니다.

이 때 나의 서비스는 이용자의 다른 서비스(Google, Kakao, Naver)의 기능을 연동해서 서비스 하고싶습니다.

예를 들어, 나의 서비스로 작성한 글들을 자동으로 네이버나 구글의 Calender에 등록하고 싶고, 또한 이용자도 원한다면, 이용자는 저에게 그들의 아이디와 비밀번호(네이버, 카카오 등)를 알려주어야 할것입니다

하지만 이거슨 매우 부담스러운 일입니다.

사용자 입장에서는 신뢰할수 없는 저에게 그들의 정보를 주어야 하며, 저는 그들의 정보를 아주 안전하게 잘 가지고 있어야 합니다.

이렇게 되었을 때 저는 그들(네이버,카카오 등)의 모든 기능을 사용할 수 있을 것입니다.

 

바로 여기에서 이러한 위험성을 보완하고 상호 작용할수 있게 해주는 것이 OAuth 입니다.

 

User는 Google, Facbook, Twitter 등을 이용해서 AccessToken을 발급받고, 우리는 그 AccessToken을 통해

그들이 제공해주는 기능을 사용할 수 있게 됩니다. 이 때 개발자 입장에서는 User의 ID/PWD 등의 정보가 요구되지 않습니다.

 

일단 여기서 알아야 할것은 OAuth 을 통해 AccessToken 을 얻고 이것으로 우리는 그들의 서비스를 이용할 것이다!

 

용어

Resource Server(카카오, 네이버, 구글 등) & Authorization Server

로그인 API, G-mail 등 서비스를 제공해주는 플랫폼(서버)

Resource Server는 데이터를 가지고 있는 서버이며, Authorization Server는 인증과 관련된 처리를 전담하는 서버

 

Resource Owner(이용자)

우리의 서비스를 이용해줄 사용자

 

Client(잇츠 미)

내가 제공하려는 서비스(우리의 서비스)

 

 

OAuth 사용법

1. 등록

플랫폼마다 다르겠지만, OAuth를 등록하기 위해 필요한 기본적인 3가지

  • Client ID - Client를 식별하기 위한 ID
  • Client Sercret - Client의 비밀번호
  • Authorized redirect URIs - Client가 요청할 URI, 만약에 다른 주소로 요청할 경우 무시

 

image

후훗 평소에는 이용자(Resource Owner)가 우리의 서비스(Client)를 마구 이용하고 있을 겁니다. 이 때 우리의 서비스와 연동해서 페이스북에 글을 등록하던지, 아니면 구글의 Calender에 일정을 등록을 하던지 막 뭘 하려면, 이용자는 Resource Server 측에 요청을 해야합니다. 이놈들을 자주 보셨을 겁니다

image

이 버튼의 소스코드를 들여다보면, Client ID , redirect Uri ,제공해주는 서비스가 무엇인지 알 수 있고, 이용자가 저 주소로 접속을 하게 되면, Resource Server가 현재 이용자가 로그인이 되어있는지 확인을 하고, 안되있을 경우 로그인을 하도록 유도합니다. 그 다음 접속을 지금 시도하고 있는 Client의 주소와 redirect Uri 와 같은지 다른지를 확인하고, 또 부여했던 Client id 도 확인하게 됩니다. 만약 모든것이 알맞다면, Resource Server는 이용자에게 Client 한테 사용하고자 하는 기능의 권한을 줄 것인지 물어보며, 사용자가 허용하면 Resource Server의 DB에는 허용했다는 정보가 저장됨가 동시에 Client는 접근할 수 있는권한을 가지게 됩니다. 그래서 막 이용자는 Client의 서비스를 이용해서 페이스북에 글을 올린다던지, 뭐 이용자가 Client에게 권한을 허용할 것들을 이용자는 Client를 통해 이용할 수 있게 됩니다.

'IT' 카테고리의 다른 글

마크다운[Typora] 문법 요약  (0) 2017.11.09
SD 카드 용량이 63MB? 16GB를 되찾아주는방법  (0) 2017.03.01
동글동글 ! 블루투스 4.0 동글 !  (0) 2016.12.18
람다이~1

AWS lambda 를 통해 이미지 리사이즈 서버 만들기(Node.js)

AWS Lambda 는 이벤트 에 응답하여 코드를 실행 하고 해당 코드에 필요한 컴퓨터 리소스를 자동으로 관리하는 컴퓨터 이다. lambda를 통해 서버에 대한 걱정없이 코드를 실행할 수 있다

이번 실습에서 AWS S3도 활용을 할것인데, S3은 Simple Storage Service의 줄임말로 아마존 웹 서비스에서 제공하는 온라인 스토리지 웹 서비스이다. S3는 웹 서비스 인터페이스를 통해 스토리지를 제공한다 . S3는 모든 타입에 대한 내구성 높은 개체 스토리지 서비스

그리고 또 하나 AWS API GATEWAY도 사용 할 것인데, API란 resource와 method의 집합으로 운영체제나 데이터베이스 관리 시스템과 같은 시스템 프로그램과 통신할 때 사용되는 것으로 API GATEWAY는 API Endpoint를 단일화하고 API 관리를 쉽게 할 수 있드아

준비물 : AWS ID (프리티어 1년 기간 남은걸로) , 편집기(atom , 아무거나) , NPM(요건 inessential) , Post Man

그리고 지역 설정할 때 무조건 아시아 태평양(서울) 로 설정

총 2부로 실습을 해볼 것인데

1부 Lambda With S3

  1. S3 버켓 생성
  2. 람다 함수 생성
  3. 람다 와 S3를 트리거 후 이미지 리사이즈 실습

2부 Lambda With API GATEWAY

  1. 새로운 람다 함수 생성
  2. API GATEWAY 에서 API 발급 , 배포
  3. Post Man을 통해

1부

AWS 홈페이지에 접속, 로그인을 한 후 서비스 에서 S3를 들어갑니다 들어갑니다

2018-02-09 11 54 52

 

그다음으로 원본 이미지가 저장 될 (1)S3 스토리지Lambda에서 (1)S3 스토리지에 원본 이미지가 저장(이벤트)된 것에 대하여 응답하고 리사이즈한 이미지를 저장할 (2)S3 스토리지를 하나 더 만듭니다.

 

2018-02-09 12 05 34

여기서 버킷은 S3 스토리지에 저장하는 모든 타입의 정보에 대한 컨테이너로

아이스버킷 챌린지에서 얼음이 든 양동이를 뒤집어 쓰던 IT업계 들의 CEO들이 기억나실텐데 , 거기서 나온 그 '양동이'가 바로 버킷 입니다. 파일을 담는 폴더의 개념으로 생각하시면 됩니다.

리전은 위와 같이 하시되, 이름은 원본이 저장될 버킷이 'abc'라고 가정 한다면 , 리사이즈 된 이미지가 저장될 버킷은 'abc-resized'로 해주시면 되겠습니다. -resized를 붙이시면 됩니다

2018-02-09 12 08 05

 

그 다음 S3에 원본이 저장될 버킷에 들어 가신 후 업로드 될 폴더를 만들어야 하는데, 이름을 images 라고 하겠습니다.

2018-02-09 12 16 19

 

이제 Lambda 함수를 생성하러 고고씽

일단 서비스에서 Lambda를 들어갑니다.

2018-02-09 12 18 48

 

오른쪽 위에 함수 생성을 누른 후 이름은 각자 알맞게 작성 후 런타임은 현재 Node.js 6.10 버전을 제공 하고 있어 이걸로 선택하고, 역할은 사용자 지정 역할 생성으로 들어간 뒤 lambda_basic_execution으로 주는데, 이것은 Lambda가 어디에 접근 할수 있는지에 대한 권한으로 나중에 다시 IAM 서비스를 통해 다시 설정 할 것이다.

 

2018-02-09 12 25 54

 

함수를 생성 했으면, Event가 들어왓을 때 Lambda에서 실행할 코드를 작성해야 하는데, 코드를 여기다 올리겠습니다. 편집기 Atom에서 새로운 폴더를 하나 만들어 index.js파일을 만들어 이 소스코드를 저장하겠습니다. 그리고 Node.js에서 AWS에 접근하기 위해서는 aws-sdk 모듈을 사용해야 하는데, Lambda의 Node.js 런타임에 이 모듈이 이미 설치가 되어있고, 필요한 모듈은 Npm으로 직접 설치하여 압축한 후 Lambda에 올리면 되겠습니다. 이 코드를 요약해서 설명하자면, origin 버킷에 이미지를 저장할 경우, 이미지를 리사이즈 하여 -resized 버킷에 저장합니다.

위에 터미널에서 NPM으로 필요한 모듈을 설치

 

2018-02-09 1 18 27

이미 세개의 파일을 압축 후 Lambda에 zip파일 형태로 업로드 하면 됨

2018-02-09 1 19 33

밑에 보면 기본 설정 카테고리가 있는데, 제한시간을 10초로 지정

 

함수를 생성 했으면, 이제 Lambda에다 trigger를 설정할 것인데,

여기서 trigger란 어떤 Action 이나 Event가 발생 하였을 때 자동으로 처리하는 프로세스 입니다.

여기서 우리가 해야 할 것은 S3 스토리지에 이미지가 저장 될 때, 이미지가 저장 된 event를 보고 Lambda가 다른 S3 스토리지에 리사이즈 된 이미지를 저장 하는 코드를 실행 할 것입니다.

2018-02-09 1 20 48

왼쪽 목록 중 S3선택 후

 

2018-02-09 1 20 55

접두사는 S3에 만든 images 폴더 이며 위와같이 설정하고 추가하면 됨

그리고 저장을 해주면 되겠습니다.

 

그리고 마지막으로 해야 하는게 , Lambda에게 S3에 접근 할 권한을 부여해야하는데 이것은 IAM을 통해 권한을 만든 후 , Lambda에게 설정을 할 수 있습니다.

2018-02-09 1 29 46

 

2018-02-09 1 30 11

 

2018-02-09 1 30 30

 

2018-02-09 1 30 48

 

2018-02-09 1 31 42

IAM 들어간 후 왼쪽 목록에 역할을 클릭 후 서비스에서 Lambda를 선택 한 후 AdministratorAccess를 선택하는데, 이는 Lambda에게 모든 AWS service에 접근할 수 있는 권한을 뜻합니다. 이렇게 역할을 만든 후, 서비스에서 Lambda로 다시 돌아와 lambda_basic_execution에서 방금 만든 역할로 바꾸고, 저장 하면 되겠습니다

 

2018-02-09 1 36 04

 

이제 실행을 해볼것인데, 동작원리를 위에서 계속 언급한것 처럼 , S3 origin 버킷에 이미지를 Upload 하는 Event를 할 경우, Lambda에서 trigger하여 S3 origin 버킷에 이벤트가 발생 했을경우, index.js의 코드를 실행하여, S3 resized 버킷에 리사이즈 된 이미지를 저장합니다.

 

이제 S3에 이미지를 저장하는 Event를 해보겠습니다.

S3 origin 버킷으로 들어가 처음에 만든 images 폴더에 png형식의 사진을 업로드 하겠습니다.

2018-02-09 1 38 47

 

2018-02-09 1 39 01

위에 두 사진을 비교해 보면, S3 resize 버킷에 크기가 리사이즈된 이미지가 저장된 걸 볼 수 있습니다.

 


2부

API GATEWAY를 통해 API를 발급 받고, Post Man으로 발급 받은 api를 통해 람다에 접근하여 , S3 origin 버킷에 이미지를 저장 후, S3 resize 버킷에 이미지를 저장해보겠습니다.

 

일단 새로운 람다 함수를 생성합니다. 처음 방법과 다 똑같이 만들돼, 역할은 아까 모든 접근을 허용하는 역할을 만들었는데, 그 역할을 그대로 사용하겠습니다.(사용자 지정 X , 기존 역할 O)

 

Lambda에서 실행할 코드는 요거 인데

const originBucket = '/images' 이 부분에서 origin 버킷 이름을 자기 걸로 수정하면 됩니다.

또한 필요한 NPM 모듈을 설치해주면 됩니다.

 

이제 API GATEWAY에서 API를 발급받을 건데, 서비스에서 API GATEWAY를 들어갑니다.

요약해서 짧게 설명하면 API발급 -> 리소스 생성(post 방식) -> 메소드 생성

서서서2018-02-09 1 56 37

API를 생성 후 작업에서 리소스 생성을 선택 한 후 , 리소스 이름을 upload 로 설정 후 생성합니다.

2018-02-09 2 00 35

 

2018-02-09 2 02 42

upload를 클릭 후 왼쪽 목록에서 설정으로 들어 간 후

 

2018-02-09 2 02 26

이진 미디어 형식을 다음과 같이 추가합니다. multipart/form-data

마무리로 Save Changes

이진 미디어 형식이란 API GATEWAY에서 이미지가 들어오면 자동으로 이미지 변환 처리를 해주는 걸 뜻합니다.

 

그 다음 메소드 생성 후 post 방식으로 이미지를 보낼 것이기 때문에 post로 설정 후 다음과 같이 설정합니다.

2018-02-09 2 12 31

리전에서 ap-northeast-2 를 선택한 이유는 아시아 태평양(서울)이 여기에 해당하기 때문

함수는 2부 처음에 만들었던 람다 함수를 넣으면 된다

 

아까 만든 메소드에서 Post를 클릭 후 오른쪽 위에 있는 통합 요청을 클릭

2018-02-09 2 18 10

 

2018-02-09 2 18 58

 

밑에 내려보면 본문 매핑 템플릿이 있는데 , 요청 본문 패스스루란 데이터를 어떻게 받아올지 정의 하는 것으로 multipart/form-data로 설정 하고 템플릿 생성에서 메서드 요청 패스스루를 선택 한후 저장 하면된다. 템플릿 생성은 AWS 자체에서 만들어 준다.

 

이제 마지막으로 API를 배포하면 되는데 , 리소스나 메소드를 생성한것 처럼 생성을 눌러 api 배포를 선택한다

2018-02-09 2 38 58

 

생성하게 되면 URL 호출이 뜨면서

https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/

이런 형식이 쭈루룩 써있을텐데,

여기서 {restapi_id}는 API 식별자이고, {region}은 API 배포 리전이고, {stage_name}은 API 배포의 단계 이름

이 URL을 통해 API를 호출 할 수 있게 된다.

 

이제 Lambda에서 만든 API를 trigger를 통해 설정하면된다.

2018-02-09 2 27 00

 

2018-02-09 2 27 05

 

마지막으로 Post Man을 통해 API url을 통해 이미지를 보내 보겠드아.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

미니게임지옥

프로젝트 이름

미니 게임 지옥 (Java GUI AWT)

 

프로젝트 개요

프로젝트 설명

Java AWT으로 구현한 게임 프로젝트 입니다.

 

프로젝트 기획

CLI가 아닌 GUI를 통해 이용할 수 있는 간단한 프로그램 구현 및 프로그래밍 연습을 위한 프로젝트

프로젝트 환경

개발 환경

jdk 1.8

 

실행 환경

Mac OS | Window OS | jre 1.8

 

프로그래밍 언어

Java 1.8

 

라이브러리

AWT

 

프로젝트 예시

준비된 예시 종류

imageYoutube Video imageGithub Repository

 

유튜브 영상

미니게임지옥 링크

깃허브

깃허브 링크

프로젝트 특징

Thread

프로젝트를 진행하면서, 다른 두개의 일을 동시에 진행 해야하는 것이 있었다.

게임 플레이를 하면서 동시에 경과시간이 계속 흐르는 것과 또 하나는 배경의 눈이 계속 떨어져야 하는데, 이를 Thread를 통해 쉽게 구현할수 있었음.

 

페인팅 이벤트

Java AWT 환경에서 처음에 가장 오해하기 쉬운 부분 중 하나가 바로 페인팅 프로세스이다. 과거 한참 AWT 파고 있던 본인도 마찬가지의 실수를 범한 것이기도 하다.

Java 의 GUI 근간을 형성하는 Component 위에 원하는 형태를 그리려면 paint(Graphics) 메소드를 오버라이딩하여 원하는 것을 그려야 한다는 점은 익히 잘 알고 있으리라 생각한다. (update 메소드 및 Canvas 등에 대해서는 여기선 별도로 언급하지 않겠다) 그리고 이렇게 구현된 paint(Graphics) 메소드 및 컴포넌트의 기본적인 형태를 그리는 작업이 컴포넌트를 그려야만 하는 여러 가지 상황, 혹은 사용자의 요청에 의해서 수행된다는 것 역시도 기본적인 AWT 에 대한 지식이 있다면 잘 알고 있으리라 생각한다. 중요한 점은 이 페인팅 작업이 이벤트 큐잉을 통하여 처리되는 방식이라는 것이고, 이에 대해 제대로 이해하지 못하고 코딩을 수행할 경우 여러 가지 예상치 못한 결과를 가져오게 된다.

흔히 컴포넌트를 다시 그리는 작업을 수행할 때 사용되는 repaint() 메소드가 이러한 문제를 발생시키는 좋은 예이다. repaint() 를 호출하면 즉시 컴포넌트를 다시 그릴 것이라고 간주하고 이후 처리하게 코딩하는 경우가 많은데 실제로는 그렇게 동작하지 않으므로 난감한 상황에 이르는 경우가 많다.

이의 동작은 실제로는 아래와 같다.

img

즉 repaint() 메소드를 호출하면, 즉시 페인팅 작업을 수행하는 것이 아니라, 페인트 이벤트 발생으로 취급, AWT 이벤트 큐에 페인트 이벤트를 집어넣고 종료시킨다. 그리고 이벤트 큐에 먼저 얹어져 있던 이벤트들이 차곡차곡 처리되고 난 다음 비로소 페인트 이벤트가 수행되고, 이에 따라 해당 컴포넌트의 paint(Graphics) 메소드가 호출되는 것이다.

이런 이벤트 큐 형식으로 처리되기 때문에, repaint() 호출이 AWT 이벤트 처리기와 동일한 스레드, 즉 이벤트 핸들러로부터 동작되는 코드 흐름이었다면 해당 이벤트 핸들러로 시작된 코드 흐름이 완전히 종료되기 전까지는 절대 페인팅 이벤트가 처리되지 않을 것이므로, repaint() 호출 직후에 무슨 짓을 해도 paint(Graphics) 가 바로 호출되게 할 수는 없다. 이에 대해서는 아래의 그림을 참조하자

img

repaint() 의 호출이 이벤트 핸들 코드 흐름이 아닌 다른 스레드라 할 지라도 위의 구조로 인해 repaint() 와 실제로 paint(Graphics) 간의 거리를 확정하기 어렵고, 많은 경우 둘간의 간극은 꽤 느린 편이므로 repaint() 호출 직후에 뭔가 코드를 써 넣는다고 하더라도 paint(Graphics) 호출 뒤에 실행될 가능성은 매우 낮다.

따라서 이런 이벤트 처리 시퀀스와 독립적으로 페인팅 작업을 수행하려 한다면, 다른 메소드를 호출해야 한다. 이를 위해 제공되는 것이 바로 paintImmediately() 이다. 이 메소드는 호출하면 메소드 명칭 그대로 '즉시' 페인팅을 수행한다.

'Portfolio' 카테고리의 다른 글

ITHRer (IT분야에서 취업하는 사람들)  (0) 2019.04.26

+ Recent posts