오늘이라도

[기술] OAuth 2.0, 개발자 입장에서 간단 정리 본문

개발 공부/도구

[기술] OAuth 2.0, 개발자 입장에서 간단 정리

upcake_ 2021. 7. 12. 10:40
반응형

 - 선 3줄 요약 -

1. OAuth는 제각각인 인증 방식을 표준화 하기위해 만들어진 보안 프로토콜

2. 개발자 입장에서 OAuth의 목적은 access_token을 발급받기 위한 것

3. client_id, client_secret, scope, code, redirect_uri가 무엇인지 알아두자

 

0. 서론

 OAuth 작업을 하면서 공부한 것들을 간단하게 적어보려 합니다.

 

저 같은 초보 개발자분들이 비슷한 초보가 공부하면서 정리한 것을 보면서 조금이라도 OAuth를 이해하는 데에 도움이 되었으면 좋겠습니다.

 

 

1. OAuth란?

OAuth 로고

 기존에는 단순히 아이디와 비밀번호를 주고 받는 인증 방식을 사용했었습니다.

 

하지만 이런 아이디와 비밀번호 같은, 중요한 정보를 이용한 인증 방식은 보안상 취약한 구조였습니다.

이를 개선하기 위해 각 애플리케이션들은 각자 회사가 개발한 방법을 이용하게 됩니다.

 

이런 제각각인 인증 방식을 표준화하고자 만들어진 기술이 OAuth입니다.

 

현재 OAuth는 2.0버전이며 국제 인터넷 표준화 기구(IETF)에 의해 정식 표준기술로 인정받게 되었습니다.

 

 

2. OAuth 인증의 진행 과정

0. 리소스 오너 : 소비자 / 클라이언트 : 개발자측 애플리케이션 / 리소스서버 : 서버(구글 같은곳)
1. 클라이언트에서 리소스서버에 서비스 사용을 등록함
2. 리소스서버에서 클라이언트에 client_id, client_secret 부여함
    2-1. client_secret은 "절대로" 노출되어선안됨
3. 리소스서버가 리소스오너에게 로그인 요청
4. 리소스서버가 리소스오너에게 클라이언트가 당신의 정보를 사용하려 한다는 동의요청을 함
5. 리소스서버가 클라이언트에게 요청받은 정보를 제공에 동의했다는 키를 제공해줌 이것을 code라고 함
    5-1. code는 일종의 비밀번호 같은 것
6. 클라이언트는 리소스서버에 id, secret, code를 다시 리소스서버에 넘김
7. 리소스서버가 현재 권한을 달라고 요청한 클라이언트의 id, server, code가 client에 부여한 정보가 맞는지 비교후 승인
8. 정보가 유효하다면 클라이언트에게 access_token을 발급함
    8-1. 진짜 비밀번호 같은 것
    8-2. 잘 보관해야함
9. 클라이언트는 리소스서버에 access_token을 제출하여 필요한 정보를 요청함
10. 리소스서버는 access_token이 유효하다면 요청받은 정보를 제공해줌

11. 필요하다면 refresh_token을 이용해서 access_token을 재발급 받을 수 있음

 

3. 그래서 인증받으려면 뭘 해야하는거죠?

1. 인증 창을 띄운다

function oAuth2() {
	var baseURL = "https://accounts.google.com/o/oauth2/v2/auth";
	var popUpOption = "width=450, height=500, menubar=no, status=no";
    
    // 서비스를 등록하면서 정한 scope
	var scope = "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutubepartner"; 
	
    // 인증 후 연결될 URI
    var redirect_uri = "${redirect_uri}"; 
	
    // 서버에 서비스를 등록하고 발급받은 client_id
    var client_id = "${client_id}"; 
	var oAuth2URL = baseURL + "?scope=" + scope + "&access_type=offline&redirect_uri=" + redirect_uri + "&response_type=code&client_id=" + client_id;
	var oAuth2 = window.open(oAuth2URL, "", popUpOption);
}

 

2. 인증 창의 구성

 

3. 발급 받은 code로 access_token을 요청한다.

//oAuth2 인증 HttpRequest 메소드, access_token Return
public String doOAuth2Request(String code, String client_id, String client_secret, String redirect_uri) {
	HttpsURLConnection conn = null;
	DataOutputStream dos = null;
	InputStreamReader isr = null;
	BufferedReader br = null;
	String access_token = null;
	
	try {
		String baseURL = "https://oauth2.googleapis.com/token";
		String grant_type = "authorization_code";
		
		StringBuffer sb = new StringBuffer();
		sb.append(baseURL);
		sb.append("?code=" + code);
		sb.append("&client_id=" + client_id);
		sb.append("&client_secret=" + client_secret);
		sb.append("&redirect_uri=" + redirect_uri);
		sb.append("&grant_type=" + grant_type);
			
		URL url = new URL(sb.toString());
		conn = (HttpsURLConnection) url.openConnection();
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0");
		conn.setDoOutput(true);
		dos = new DataOutputStream(conn.getOutputStream());
		dos.flush();
			
//		int responseCode = conn.getResponseCode();
//		String responseMsg = conn.getResponseMessage(); 
//		log.info("POST URL : " + sb.toString());
//		log.info("리스판스 코드 : " + responseCode);
//		log.info("리스판스 메시지 : " + responseMsg);
				
		Charset charset = Charset.forName("UTF-8");
		isr = new InputStreamReader(conn.getInputStream(), charset);
		br = new BufferedReader(isr);
		String inputLine = null;
		StringBuffer response = new StringBuffer();
			
		while ( (inputLine = br.readLine()) != null ) {
			response.append(inputLine);
		}
			
		JSONParser jsonParser = new JSONParser();
		JSONObject data = (JSONObject) jsonParser.parse(response.toString());
		access_token = data.get("access_token").toString();
	} catch(Exception e) {
		e.printStackTrace();
	} finally {
		try {
			if (dos != null) dos.close();
			if (br != null) br.close();
			if (isr != null) isr.close();
			if (conn != null) conn.disconnect();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	return access_token;
}

 

4. 발급 받은 access_token을 필요한 API 요청에 활용한다.


 * 참고 사이트 *

 - 생활코딩 : opentutorials.org/course/2473/16571

 

구글 API를 통해서 배우는 인증 (oauth 2.0) - 생활코딩

수업소개 API를 사용하는데 큰 걸림돌은 인증입니다. 사용자에게 최적화된 서비스를 제공하기 위해서는 그 사용자의 정보에 접근할 수 있어야 합니다. 많은 서비스가 인증을 위한 방법으로 oauth

opentutorials.org

 

 - 위키피디아 : ko.wikipedia.org/wiki/OAuth

 

OAuth - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통

ko.wikipedia.org

 - 구글API OAuth : https://developers.google.com/identity/protocols/oauth2/web-server

 

웹 서버 애플리케이션에 OAuth 2.0 사용  |  Google ID 플랫폼  |  Google Developers

이 문서는 웹 서버 애플리케이션이 Google API 클라이언트 라이브러리 또는 Google OAuth 2.0 엔드 포인트를 사용하여 Google API에 액세스하기 위해 OAuth 2.0 인증을 구현하는 방법을 설명합니다. OAuth 2.0을

developers.google.com

 

 - 줌API OAuth : https://marketplace.zoom.us/docs/guides/auth/oauth

 

OAuth 2.0 - Authorization - Documentation

OAuth with Zoom The Zoom API uses OAuth 2.0 to authenticate and authorize users to make requests. To set up access credentials and request scopes for y...

marketplace.zoom.us

 

반응형