리소스에 대한 액세스를 타사 응용 프로그램에 제공하려고 한다고 가정해 보겠습니다. 타사 애플리케이션이 리소스를 오용하지 않도록 하려면 어떻게 해야 합니까? 이 문서를 완료하면 리소스에 대한 액세스를 제공하는 안전한 방법을 찾을 수 있습니다. 또한 '스프링 부트 프로젝트에서 OAuth를 구현하는 방법'을 배우게 됩니다. 그게 다야. OAuth는 매우 안전한 방식으로 리소스에 대한 액세스를 제공하는 메커니즘입니다. 그러나 인증보다는 권한 부여와 전혀 관련이 없습니다.
예를 들어, Google 드라이브에 많은 기밀 페이지가 저장되어 있고 문서 검토 팀에서 이를 검토하고 검토 의견으로 업데이트해 주기를 원합니다. 이메일이나 파일 전송 기술 등과 같은 다른 방법으로 보내는 것이 가장 쉬운 방법이라고 생각할 수도 있습니다. 그러나 이것은 기밀 페이지라고 언급했기 때문에 올바른 방법이 아닙니다. 따라서 보안상의 이유로 네트워크를 통해 전혀 보낼 수 없습니다. 검토 팀이 Google 드라이브에서만 액세스할 수 있는 방법을 찾아야 합니다. 또한 검토 팀은 검토에 액세스할 수 있어야 하며 그에 따라 검토 의견을 보내야 합니다. 이를 가능하게 하는 방법은 '스프링 부트 프로젝트에서 OAuth를 구현하는 방법'에서 찾을 수 있습니다.
OAuth 란 무엇입니까?
OAuth는 자격 증명이 아닌 액세스 토큰을 통해 웹 애플리케이션, 서버, 장치, API 등을 인증하는 기술입니다. API나 서비스가 아닌 권한 부여를 위한 개방형 표준이라고 부를 수도 있습니다. 또한 OAuth를 사용하면 본질적으로 비밀번호를 제공하지 않고도 Google, Facebook, Twitter, Microsoft 계정 등으로 타사 웹사이트에 로그인할 수 있습니다. 또한 사람들이 리소스 데이터에 액세스할 수 있는 더 안전하고 안전한 방법입니다. 따라서 OAuth는 보호된 리소스 데이터를 게시하고 상호 작용하는 간단한 방법입니다. 타사 클라이언트/애플리케이션에 API 액세스를 제공하려면 OAuth도 구현해야 합니다.
또한 OAuth 는 서비스가 서비스에 대한 위임된 액세스로 사용자를 대신하여 다른 서비스에 권한을 부여하는 것을 의미합니다. 통신에는 HTTPS를 사용하고 권한 부여에는 액세스 토큰을 사용합니다. OAuth는 일반적으로 액세스 위임에 사용됩니다. 사용자 ID와 비밀번호를 제공하지 않고도 다른 애플리케이션이나 웹사이트에 리소스에 대한 액세스를 제공할 수 있습니다.
OAuth 기술의 사용을 어디에서 확인할 수 있습니까?
실제로 웹사이트에서 사용자 등록 과정에서 OAuth의 사용을 관찰할 수 있습니다. 오늘날 많은 웹사이트 또는 애플리케이션이 Google/Facebook/Twitter 등과 같은 소셜 사이트 계정을 통해 다른 웹사이트 또는 애플리케이션에 인증할 수 있는 가능성을 제공합니다. 실제로 사용자가 더 이상 다른 계정을 만들고 자격 증명을 기억할 필요가 없기 때문에 더 유용하고 편리합니다. 대신 사용자는 예를 들어 Google 계정을 사용하여 다양한 서비스에 액세스할 수 있습니다. 이것은 OAuth를 통해 가능합니다.
액세스 토큰이란 무엇입니까?
액세스 토큰은 인증 서버에서 생성한 임의의 문자열 또는 숫자입니다. 조직에서 소형 디지털 장치를 사용하거나 사용하는 사람을 본 적이 있을 수 있습니다. 사실, 이 작은 장치는 클라이언트 측 작업 환경에 액세스하기 위해 토큰(예: 임의의 암호)을 생성합니다. 간단히 말해서 이 장치는 일종의 액세스 토큰 생성기에 지나지 않습니다. 또한 수명이 제한되어 있고 기밀성이 있습니다.
실제로 이 토큰은 리소스 서버에 대한 요청의 헤더 또는 매개변수로 클라이언트(리소스에 액세스하려는 클라이언트)에 의해 전송됩니다. 액세스 토큰의 범위를 정의하는 권한 부여 서버의 책임입니다. 클라이언트 응용 프로그램은 권한 부여 서버에 대한 요청과 함께 필요한 범위 및 제한을 제공해야 합니다. 이 매개변수를 기반으로 인증 서버는 애플리케이션의 액세스 권한을 제한합니다.
리소스, 리소스 소유자, 리소스 서버, 권한 부여 서버 및 클라이언트와 같은 용어는 모두 무엇입니까?
애플리케이션에서 OAuth 개념을 구현하는 동안 이러한 모든 용어를 접해야 합니다. 그러므로 우리는 이것들이 무엇이며 서로 어떻게 작동하는지에 대한 명확한 아이디어가 있어야 합니다. 따라서 먼저 더 나은 방식으로 하나씩 이해하기 위해 사용 사례에 대해 이야기합시다.
예를 들어, 앞서 언급한 요구 사항을 고려해 보겠습니다. Google 드라이브에 많은 기밀 페이지가 저장되어 있고 문서 검토 팀이 해당 페이지를 검토하고 검토 의견으로 업데이트하기를 원할 때. 이메일을 보내거나 다른 가능한 수단을 통해 네트워크를 통해 이러한 기밀 페이지를 보낼 수 없음을 기억하십시오. 이제 OAuth 기술을 사용해야 합니다.
리소스/보호된 리소스
리소스는 보안상의 이유로 실제 세계에서 보호되는 것입니다. 리소스에 액세스하려면 OAuth 기술이 필요합니다. 어떤 사람들은 그것을 보호 자원이라고도 부릅니다. 예를 들어 Google 드라이브에 저장된 기밀 페이지는 사용 사례에 따른 리소스입니다.
리소스 소유자
리소스 소유자는 리소스를 소유하거나 리소스에 대한 전체 액세스 권한이 있는 사람입니다. 업계의 어떤 사람들은 그것을 사용자라고 부르기도 합니다. 사용 사례에 따라 귀하는 리소스 소유자입니다.
리소스 서버
리소스 서버는 리소스를 보유/저장하는 서버입니다. 때로는 리소스 호스트라고도 합니다. 우리의 경우 Google 드라이브가 리소스 서버입니다.
고객
클라이언트는 필요한 서비스를 제공하기 위해 소유자를 대신하여 리소스에 액세스해야 하는 애플리케이션입니다. 우리의 사용 사례에서 검토 팀이 귀하의 문서를 검토하는 데 사용할 애플리케이션/소프트웨어는 클라이언트입니다. 간단히 말해서 문서 검토 서비스라고도 할 수 있습니다.
권한 부여 서버
Authorization Server는 리소스 서버의 리소스에 액세스할 수 있도록 클라이언트에게 Access Token을 제공하는 서버입니다. 일반적으로 리소스 서버 내에서 연결되거나 리소스 서버 자체가 권한 부여 서버 역할을 합니다. 그러나 때로는 별도의 개체로 존재합니다. 두 경우 모두 책임은 동일하며 리소스 서버에서만 작동합니다.
OAuth 개념은 어떻게 작동합니까?
OAuth의 작업 흐름을 자세히 이해하기 위해 앞서 언급한 사용 사례를 사용합니다. 추가로 설명하기 위해 아래 주어진 흐름도를 관찰하십시오. 설명의 단계 번호는 다이어그램에 주어진 단계 번호와 동시에 일치하여 더 나은 방법으로 이해할 수 있습니다. 또한 모든 단계를 두 개의 소제목으로 나누어 전체적으로 단순화했습니다.
인증 서버에서 액세스 토큰 가져오기
1) 사용자가 클라이언트에게 리소스 서버(Google Drive)에서 내 리소스에 액세스하여 문서를 검토하도록 요청하고 있습니다.
2) 클라이언트는 리소스 소유자를 대신하여 리소스에 대한 액세스 권한을 얻기 위해 권한 부여 서버로 이동합니다.
3) Authorization Sever는 리소스 소유자가 클라이언트가 자신의 리소스에 액세스하기를 원하는지 확인합니다. 또한 리소스 소유자에게 클라이언트가 귀하를 대신하여 액세스하기를 원하는 모든 리소스가 무엇인지 묻습니다.
4) 리소스 소유자가 대답합니다. 예, 저는 클라이언트가 내 특정 리소스에 액세스하기를 원하는 사람입니다.
5) 리소스 소유자로부터 확인을 받은 후 Authorization 서버는 Authorization 토큰을 클라이언트에 보냅니다.
6) 그런 다음 클라이언트는 요청과 함께 동일한 Authorization 토큰을 보내는 Access Token을 Authorization 서버에 요청합니다.
7) Authorization Server는 클라이언트가 필요한 자원에 접근할 수 있도록 Access Token을 제공합니다.
리소스 서버에서 리소스에 액세스하기
8) 클라이언트는 리소스 소유자의 리소스에 액세스하기 위해 Authorization 서버에서 제공한 액세스 토큰으로 리소스 서버에 요청을 보냅니다.
9) 리소스 서버는 클라이언트가 인증 서버와 함께 제공한 액세스 토큰의 유효성을 검사합니다.
10) 인증 서버는 액세스 토큰의 유효성을 검사하고 리소스 서버에 확인을 보냅니다.
11) 결과적으로 리소스 서버는 클라이언트에 리소스 액세스를 제공합니다.
12) 마지막으로 클라이언트(문서 검토 서비스)는 내부 응용 프로그램/소프트웨어를 사용하여 문서를 검토하고 리소스 소유자(사용자)에게 검토 의견을 제공합니다.
Spring Boot 프로젝트에서 OAuth 2.0을 구현하는 방법은 무엇입니까?
다양한 용어에 대한 모든 필수 지식을 얻은 후에는 OAuth 2.0 을 구현할 차례 입니다. 페이스북에서 구현해보자. 먼저 OAuth 클라이언트는 Facebook 애플리케이션을 생성해야 합니다. 실제로 Facebook 애플리케이션에는 OAuth 요청을 만들기 위한 전제 조건인 클라이언트 ID와 클라이언트 비밀이 포함됩니다.
어떤 소프트웨어/기술이 필요합니까?
♦STS(Spring Tool Suite): 버전-> 4.7.1.RELEASE ⇒
종속 스타터: Spring Security, Spring Web, Cloud OAuth2, Spring Boot DevTools
♦JDK8 이상 버전(JDK8, JDK11 및 JDK14에서 철저히 테스트됨)
1단계: Facebook에서 앱 만들기
1) developer.facebook.com
으로 이동 2) '내 앱'
클릭 3) 앱 만들기 클릭 후 '다른 것' 선택 후 '계속'
4) '앱 표시 이름' 채우기
5) '앱 만들기' 클릭 '
6) 이제 Captcha를 확인하고 '제출'
을 클릭합니다. 7) 설정을 클릭한 다음 '기본'을 클릭하면 오른쪽에 앱 세부 정보가 표시됩니다.
8) '앱 ID' 및 '앱 비밀번호'를 기록해 둡니다.
2단계 : STS(Spring Tool Suite)에서 Spring Boot Starter 프로젝트 생성
스타터 프로젝트를 생성하는 동안 스타터 프로젝트 종속성으로 'Spring Security', 'Spring Web', 'Cloud OAuth2' 및 'Spring Boot DevTools'를 선택합니다. Spring Boot Starter 프로젝트를 생성하는 방법을 모르더라도 내부 링크 를 방문하십시오 .
3단계 : Starter 클래스 에서 @EnableOAuth2Sso 적용
Spring Boot 프로젝트의 스타터 클래스는 아래 코드와 같이 @EnableOAuth2Sso로 주석을 달아야 합니다.
SpringBootOAuth.java
package com.dev.spring.security.oauth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
@SpringBootApplication
@EnableOAuth2Sso
public class SpringBootOAuth {
public static void main(String[] args) {
SpringApplication.run(SpringBootOAuth.class, args);
}
}
3단계: 컨트롤러 클래스를 UserController.java로 생성
OAuth를 통해 연결하는 데 도움이 되는 사용자 세부 정보를 얻기 위해 하나의 컨트롤러 클래스를 만듭니다. 또한 그 위에 @RestController를 적용합니다.
사용자 컨트롤러 .java
package com.dev.spring.security.oauth.controller;
import java.security.Principal;
import java.util.Map;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/")
public String getUserDetails(Principal principal) {
OAuth2Authentication oAuth = (OAuth2Authentication) principal;
boolean isAuthenticated = oAuth.isAuthenticated();
Map<String, Object> details = (Map<String, Object>)oAuth.getUserAuthentication().getDetails();
String username = (String)details.get("name");
return "Username: " + username
+ "<br><br>" +
"Is User Authenticated? : "+isAuthenticated;
}
@GetMapping("/user")
public Principal showUser(Principal p) {
System.out.println(p.getClass().getName());
return p;
}
}
4단계 : application.yml 파일 생성
마지막으로 application.properties 대신 application.yml을 만듭니다. 기존 application.properties를 제거하는 것을 잊지 마십시오. 그렇지 않으면 Spring Boot App이 기본적으로 이를 읽습니다.
#application.yml
-------------------------------------------------- ----------
서버:
포트: 8081
스프링:
애플리케이션:
이름: SpringBootOAuth
보안:
oauth2:
클라이언트:
clientId: 앱 ID
clientSecret: 앱 시크릿
accessTokenUri: https://graph.facebook.com/oauth/access_token
userAuthorizationUri: https://www .facebook.com/dialog/oauth
tokenName: oauth_token
authenticationScheme: 쿼리
clientAuthenticationScheme: 양식
리소스:
userInfoUri: https://graph.facebook.com/me
Spring Boot Project에서 구현된 OAuth 2.0을 테스트하는 방법은 무엇입니까?
1단계: 프로젝트를 선택하고 마우스 오른쪽 버튼으로 클릭한 다음 Run as > Spring Boot App
2단계: 브라우저를 열고 URL을 누르십시오. http://localhost:8081/
3단계: 그림과 같이 Facebook 페이지로 리디렉션됩니다. 아래에. 또한 다음과 같은 브라우저의 리디렉션된 URL을 관찰하십시오.https://www.facebook.com/dialog/oauth?client_id=**************** &redirect_uri=http%3A%2F%2Flocalhost%3A8081% 2Flogin &response_type=code&state=1Gepzv
♥ 위의 URL은 OAuth의 매력을 명확하게 보여줍니다. 🙂
4단계: '이름으로 계속하기'를 클릭합니다
. 5단계: 마지막으로 Facebook 사용자 세부정보가 있는 페이지가 아래에 표시됩니다.
여기서는 로그인하지 않아도 Facebook 앱의 사용자 정보를 가져옵니다. 이것이 OAuth의 기능입니다. 🙄
6단계: http://localhost:8081/user URL 을 입력 하면 JSON 형식과 유사한 모든 사용자 세부 정보를 볼 수 있습니다.
요약
'스프링 부트 프로젝트에서 OAuth를 구현하는 방법'의 모든 이론 및 예제 부분을 거친 후 마침내 스프링 부트 프로젝트에서 OAuth 보안을 구현할 수 있습니다. 물론 이 기사에서 우리는 OAuth 기술에 대해 철저히 배웠습니다. 앞으로 소셜 미디어 웹사이트를 승인하는 몇 가지 예를 더 포함하고 그에 따라 기사를 업데이트할 것입니다. 마찬가지로, 우리는 귀하가 이후에 귀하의 프로젝트 구현을 더욱 확장하기를 기대합니다. JWT 인증 기술에 대해 알아보려면 이전 기사 를 방문하십시오 . 또한 향후 업데이트가 있으면 이에 따라 이 기사도 업데이트하겠습니다. 또한 아래 의견 섹션에 자유롭게 의견을 제공하십시오.