REST Api 를 포함하여 Java 에서 서비스를 개발하는 것은 봄이 와서 풍경을 바꿀 때까지 항상 쉽거나 생산적이지는 않았습니다. 그 이후로 수년이 지났고 새로운 프레임 워크가 커뮤니티에 등장했습니다.
이러한 프레임 워크 중 하나는 Micronaut 입니다. 그것의 개발로 OCI,동일한 회사의 뒤에배,그리고 그들의 목표는 개발자를 돕기 위해 만들 마이크로 서비스와 서버를 사용하지 않는 응용 프로그램.
작년에 인기를 얻은 또 다른 프레임 워크 인 Quarkus 도 있습니다. RedHat 에 의해 개발 된 Quarkus 는 빠른 시작과 적은 메모리 사용,Java 에서 REST 서비스를 개발할 때 두 가지 공통적 인 문제를 제공 할 것을 약속합니다.
이 선택으로,매우 중요한 질문을 어떻게 쉽게 만들 수 있는 서비스로 이러한 세 개의 각 프레임워크?
이 튜토리얼에서 당신을 만들이 안전한 나머지를 사용하여 응용 프로그램을 봄,Micronaut 및 Quarkus 보 어떻게 다른 다른 하나는 하나의 필요에 가장 적합.
테이블의 내용.
- 위한 전제 조건이 귀하의 자바 REST API
- 을 만들 Okta 계정 사용자 관리를 위한
- 사용하여 토큰을 생성 OpenID 연결하는 디버거
- 를 구축 Java REST API 를 가진 Micronaut
- 을 개발하 Java 서비스가
- 건축 자바 REST API 를 가진 Quarkus
- 를 구축 Java REST API 를 가진 봄 부팅
- 최종 생각에 REST Api Java:Micronaut,Quarkus,봄 부팅
고 싶은 경우에는,당신이 볼 수있이 튜토리얼에 캐스팅. 👇
Java REST API 의 필수 구성 요소
이 자습서에서는 Maven3+를 사용합니다. 계속하기 전에 설치되고 사용 가능한지 확인하십시오. 당신은 확실히 또한 Gradle 를 사용할 수 있습니다,하지만 YMMV.
Okta 응용 프로그램에 의해 확보 된 OAuth2.0 을 사용하여 요청을 인증하는 응용 프로그램을 구축 할 것입니다. Okta 계정이 없습니까? 걱정하지 마세요,새로운 것을 만드는 데 1 분도 채 걸리지 않습니다. 뿐만 아니라 Okta 는 JWT,OAuth2.0 및 OIDC 와 같은 표준을 지원합니다. Java EE,Spring Boot 및 Spring Security 와 같은 잘 알려진 프레임 워크에 대한 지원을 제공합니다. 지옥,우리는 심지어 당신을 위해 모든 것을 자동화하는 메이븐 플러그인을 가지고 있습니다.바퀴를 재발 명할 필요가 없습니다!
을 만들 Okta 계정 사용자 관리를 위한
터미널을 열고,그리고 다음 명령을 실행합니다.
mvn com.okta:okta-maven-plugin:register
할 것이 요구하는 다음과 같은 정보 입력:
- 첫 번째 이름
- 이름
- 이메일
- 회사
일단 당신이 질문에 답변하고,당신을 활성화하는 이메일을 받게 귀사의 브랜드습니다. 활성화한 후,귀하의 계정에 다음 명령을 실행합니다.
mvn com.okta:okta-maven-plugin:spring-boot
이 명령을 만듭니다 당신을 위해 응용 프로그램으로 인증 코드 흐름과 봄 Security 리디렉션 URI 에 대한 Okta.
그것을 기억하는 더 나은,당신은 당신을 만들 수 있습니다 같은 수동으로 응용 프로그램:
- Okta 의 개발자 홈페이지로 이동하여 계정에 로그인하십시오.
- 클릭 응용 프로그램>>>음.
당신이 볼 수하면 다음 화면이 표시됩니다.
를 계속하기 전에,다음과 같이 애플리케이션에서 변경사항:
- 로그인을 리디렉션 Uri:
http://localhost:8080/login/oauth2/code/okta
https://oidcdebugger.com/debug
- 부여 허용 입력
- 인증 코드
- 암시(하이브리드)
암시적 권한을 부여형(ID 및 액세 토큰 허용 확인)은 필요한 액세스 토큰을 검색에서 당신의 브라우저입니다.위에서 언급하지 않은 필드는 기본값을 유지할 수 있습니다.
완료 후 완료를 클릭하십시오. 앱이 준비되었습니다!다음 단계는이를 사용하여 유효한 토큰을 생성하는 방법을 배우는 것입니다.
OpenID Connect Debugger 를 사용하여 토큰 생성
Okta 를 사용하면 Api 를 사용하여 클라우드에서 사용자를 관리 할 수 있습니다. 또한 OAuth2.0 및 OpenID Connect(일명 OIDC)를 사용하여 응용 프로그램을 보호 할 수 있습니다. OAuth2.0 은 응용 프로그램에 사용자 자격 증명을 저장할 필요가 없음을 의미하는 위임 된 권한 부여를위한 메커니즘을 제공합니다. 대신 OAuth2.0 공급자(이 경우 Okta)에 위임 할 수 있습니다. OIDC 는 OAuth2.0 위에 id 계층을 제공하며 Okta 와 같은 회사를”id 공급자”또는 Idp 라고하는 이유입니다.
Okta 로 앱을 등록했으며 이제 토큰을 생성하여 액세스 할 수 있습니다. 등록한 로그인 리디렉션 Uri 중 하나는 OpenID Connect 웹 사이트 용입니다.
귀하의 요청은 토큰을 사용하여 검증됩니다. 이 토큰을 생성하려면 OpenID Connect 디버거를 사용합니다. 이 웹 사이트는 당신에게 당신의 Okta 응용 프로그램의 사용자에 대한 자격 증명을 생성하는 쉬운 방법을 제공 할 것입니다.
이동하여https://oidcdebugger.com고 다음 정보를 입력합니다:
- 권한을 부여 URI:
https://{yourOktaDomain}/oauth2/default/v1/authorize
- Redirect URI:
https://oidcdebugger.com/debug
- 클라이언트 ID:
{yourOktaClientId}
- 범위:
openid email profile
- 상태:
dev
- Nonce:(기본값)
- 응답 입력:
token
을 찾을 수 있습에 대한 값{yourOktaDomain}
오른쪽 상단 모서리에있는 당신의 계정의 홈페이지:
를 찾 Okta 클라이언트 ID 따라 아래 단계:
- 응용 프로그램으로 이동하여
- 선택 웹 응용 프로그램
- 일반을 클릭
클라이언트 ID 에서 사용할 수 있습니다 클라이언트는 자격 증명 섹션:
를 완료한 후에는 모든 필드,보내기를 클릭하여 요청을 합니다. 당신은 당신의 Okta 로그인 페이지로 리디렉션됩니다.
성공적으로 인증되면 oidc 디버거로 다시 리디렉션되어 생성 된 토큰을 볼 수 있습니다:
사용할 것이 이 토큰을 안전하게 서비스에 액세스할 겁니다.
이제 Okta 계정하는 방법을 알고 사용하여 토큰을 생성하 Okta 응용 프로그램,자의 비교를 시작 프레임워크!
Micronaut 로 Java REST API 구축
Micronaut 서비스를 개발하는 첫 번째 단계는 SDKMAN 을 다운로드하는 것입니다!. SDKMAN! 는 Micronaut 클라이언트를 설치하는 데 사용할 여러 Sdk 의 병렬 버전을 관리하기위한 도구입니다.
당신은 SDKMAN 을 다운로드 할 수 있습니다! 다음 명령을 실행하여:이제 Micronaut 자체를 설치할 수 있습니다. 그냥에서 다음 명령을 실행하여 터미널:
sdk install micronaut
후 명령을 수행이 완료되면,당신은 최신 Micronaut 버전을 컴퓨터에서 사용할 수 있습니다.
응용 프로그램 개발을 시작할 준비가되었습니다!
Java 서비스 개발
응용 프로그램을 만들 디렉토리로 이동하여 다음 명령을 실행하십시오:
mn create-app com.okta.rest.app --build maven
이 명령은 프로젝트 만들기 기본 구조의 Micronaut 프로젝트입니다. Micronaut 은 기본적으로 Gradle 을 사용하지만--build maven
를 사용하고 있으므로 대신 Maven 을 사용합니다.다음 단계는 프로젝트 내부에 보안 라이브러리를 추가하는 것입니다. 편집pom.xml
파일을 열어서 다음을 추가하십시오존성:
<dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security</artifactId></dependency><dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security-jwt</artifactId></dependency>
이러한 의존성이 보안 사용–특히 OAuth2.0JWT–내부 프로젝트입니다. 이제 모든 종속성이 제자리에 있으므로 끝점 만들기를 시작할 수 있습니다.
을 만들은 다음과 같은 클래스에서src/main/java/com/okta/rest/controller
package com.okta.rest.controller;import io.micronaut.http.MediaType;import io.micronaut.http.annotation.Controller;import io.micronaut.http.annotation.Get;import io.micronaut.http.annotation.Produces;import io.micronaut.security.annotation.Secured;import io.micronaut.security.rules.SecurityRule;import java.security.Principal;@Controller("/hello")public class HelloController { @Get @Secured(SecurityRule.IS_AUTHENTICATED) @Produces(MediaType.TEXT_PLAIN) public String hello(Principal principal) { return "Hello, " + principal.getName() + "!"; }}
@Controller
주석을 나타냅 Micronaut 는 이 구성 요소를 요청을 받/hello
경로입니다.
클래스에는hello()
@Get
주석은 메소드가 HTTP GET 요청을 수신한다는 것을 보여줍니다. Micronaut 의 기본 반환 유형은 JSON 객체이기 때문에@Produces
가 필요합니다. 간단한 텍스트를 반환하고 있으므로 메서드에서이 정보를 명시 적으로 정의해야합니다.
마지막 주석은@Secured
입니다. 이 방법은 인증 된 사용자에게만 액세스 할 수 있음을 Micronaut 에 간단히 알려줍니다.이제 보안이 설정된 컨트롤러가 있지만 아직 보안 구성을 정의하지 않았습니다. Okta 응용 프로그램에 연결하도록 Micronaut 을 구성합시다.
이름 바꾸기src/main/resources/application.yml
application.properties
그리고 다음을 추가 보안 configuration:
micronaut.security.enabled=truemicronaut.security.token.jwt.enabled=truemicronaut.security.token.jwt.signatures.jwks.okta.url=https://{yourOktaDomain}/oauth2/default/v1/keys
바꾸기{yourOktaDomain}
값으로서 Okta 계정이다.
위의 구성은 OAuth2.0 을 사용하여 보안을 가능하게합니다. Oauth2.0 클라이언트는 Okta 조직에서 발급자를 지정하여 Okta 에서 온 것으로 선언합니다.
또한 JSON 웹 토큰 또는 JWTs 의 사용을 가능하게하고 있습니다. Okta 에서 정보를 읽고 싶기 때문에 JWT 서명의 유효성을 검사하기 위해 JWKS(JSON 웹 키 세트)를 찾을 수있는 위치를 선언해야합니다.
그것은 당신의 서비스를 테스트하는 시간이다! 응용 프로그램을 시작 실행하여 다음과 같은 명령:
./mvnw mn:run
으로의 응용 프로그램을 실행하면 다음 명령을 실행합니다:
curl -X GET -I http://localhost:8080/hello
위의 명령이 생산하는 결과 이와 유사한 하나:
HTTP/1.1 401 UnauthorizedDate: Tue, 8 Jan 2019 15:47:36 GMTtransfer-encoding: chunkedconnection: close
당신이 볼 수 있듯이,요청되지 않았습니다. 작동 시키려면 OIDC 디버거에서 검색 한 OAuth2.0 액세스 토큰을 전달해야합니다. 액세스 토큰을 셸의TOKEN
변수에 할당하십시오.
TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...
실행하여 아래의 명령:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
이제 예상대로 작동하! 이 시간에 당신을 받는 인사말로 메시지 응답:
Hello, [email protected]!
당신이 볼 수있는 Micronaut 필요 아주 작은 코드를 작성하여 나머지는 API 입니다. 코드 줄을 계산하면~24%가 XML(8 줄)의 종속성이고 Java 코드는 22 줄의 코드 일 뿐이며 보안 구성에는 3 줄이 필요하다는 것을 알 수 있습니다. Micronaut 의 내장 OAuth2.0 지원을 사용하면 Okta 와 쉽게 통합 할 수 있으며 설명서에 Okta 에 대한 안내서도 있습니다.
좋아요! 이제 Quarkus 를 사용하여 동일한 앱을 만드는 방법을 살펴 보겠습니다.
Quarkus 를 사용하여 Java REST API 빌드
Quarkus 를 사용하여 응용 프로그램을 개발하려면 Maven 만 설치해야하며 다른 종속성은 필요하지 않습니다.
앱 만들기를 시작합시다! 디렉토리로 이동하려는 그것을 만들고 다음 명령을 실행합니다.
mvn io.quarkus:quarkus-maven-plugin:1.8.1.Final:create \ -DprojectGroupId=com.okta.rest \ -DprojectArtifactId=quarkus \ -DclassName="com.okta.rest.quarkus.HelloResource" \ -Dpath="/hello" \ -Dextensions="jwt"
위의 명령을 만듭를 사용하여 프로젝트 Quarkus Maven plugin. 그것이 만들라는 자원HelloResource
/hello
경로입니다. 또한 프로젝트에서 Quarkus 의 JWT 확장을 추가하고 있습니다.
면 프로젝트를 만들고,편집src/java/com/okta/rest/quarkus/HelloResource.java
hello()
방법:
package com.okta.rest.quarkus;import io.quarkus.security.Authenticated;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.Context;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.SecurityContext;import java.security.Principal;@Path("/hello")public class HelloResource { @GET @Path("/") @Authenticated @Produces(MediaType.TEXT_PLAIN) public String hello(@Context SecurityContext context) { Principal userPrincipal = context.getUserPrincipal(); return "Hello, " + userPrincipal.getName() + "!"; }}
위의 클래스 작동과 같은 방법으로 하나를 만들에 Micronaut. 요청에서 생성 된 토큰을 기반으로 사용자의 정보를 읽고 발견 된 사용자에게 인사말 메시지를 반환합니다.
여전히 Okta 의 발급자 및 키로 Quarkus 를 구성하지 않았으므로 그렇게합시다.
편집src/main/resources/application.properties
다음 코드를 추가합니다:
mp.jwt.verify.publickey.location=https://{yourOktaDomain}/oauth2/default/v1/keysmp.jwt.verify.issuer=https://{yourOktaDomain}/oauth2/default
수행! 응용 프로그램의 Quarkus 버전을 테스트 할 준비가되었습니다. 귀하의 프로젝트 폴더에 다음 명령을 실행합니다.
./mvnw compile quarkus:dev
위의 명령이 시작 응용 프로그램입니다.
첫 번째 단계는지 확인을 받은401 - Unauthorized
를 사용하지 않는 경우 정확한 자격 증명입니다.
실행에서 다음 명령을 터미널:
curl -X GET -I http://localhost:8080/hello
예상대로 결과는 HTTP 응답 401:
HTTP/1.1 401 Unauthorizedwww-authenticate: Bearer {token}Content-Length: 0
을 실행하는 경우 이 같은 요청을 포함하여,토큰에서 그룹 디버거 반환해야 합니다 인사말 메시지입니다.
다음 명령을 실행합니다.
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
이것은 일은 매우 간단합니다. 나의 케이스에서,결과:
Hello, [email protected]!
Quarkus 필요도 적은 라인의 코드보다 Micronaut! 종속성이 포함 된 앱을 생성하고 25 줄의 자바 코드가 있으며 2 줄의 구성 만 있습니다. 예,라인의 코드는 바보 같은 비교하지만,그것은 또한 방법을 보여줍니다 이러한 프레임워크가 필요 아주 작은 코드를 개발한다.
두 아래로,하나 갈! 이제 Micronaut 및 Quarkus 에서 앱을 구현할 수 있었으므로 Spring Boot 를 사용하여 동일한 앱을 만들어 마무리하겠습니다.
Spring Boot 로 Java REST API 빌드
Spring Boot 에는 앱 만들기를 시작하는 전제 조건이 없으므로 프로젝트를 만드는 것으로 시작하겠습니다!
터미널을 열고 다음 명령을 실행합니다:
curl https://start.spring.io/starter.zip -d language=java \ -d bootVersion=2.3.4.RELEASE \ -d dependencies=web,okta \ -d packageName=com.okta.rest \ -d name=spring-boot \ -d type=maven-project \ -o spring-boot.zip
위의 명령을 만들 것입spring-boot.zip
spring-boot
디렉토리로 추출 할 수 있습니다.
unzip spring-boot.zip -d spring-boot
지금,당신은 당신을 구현합 컨트롤러를 받을 요청합니다.그 안에
com.okta.rest.controller
HelloController
클래스를 만듭니다:
package com.okta.rest.controller;import org.springframework.security.core.annotation.AuthenticationPrincipal;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.security.Principal;@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello(@AuthenticationPrincipal Principal principal) { return "Hello, " + principal.getName() + "!"; }}
구성이 여기에 매우 유사하다 다른 프레임워크에. @RestController
로 클래스에 주석을 달아 Spring 이 클래스에 대한 요청을 받게 될 것임을 알립니다. @GetMapping
/hello
경로에서 HTTP GET 요청을 수신합니다. 인증 된 사용자를 검색하려면@AuthenticationPrincipal
주석을 사용합니다.
에서 다른 다른 프레임워크를 지정할 필요가 없는 이 끝점은 인증된 이후 봄직 컨트롤을 이 정보에서 그 구성이 있습니다.마지막 단계는 발급자 정보를 추가하는 것이므로 Spring Security 의 OIDC 지원은 통신해야하는 엔드 포인트를 자동으로 검색 할 수 있습니다.
편집src/main/resources/applications.properties
추가는 다음과 같은 구성
okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default
자 테스트! Maven 을 사용하여 Spring Boot 앱을 시작하십시오.
./mvnw spring-boot:run
그리 터미널을 열고 실행하여 아래의 명령:
curl -X GET -I http://localhost:8080/hello
응답 HTTP401 오류가 때문에,당신은 포함되지 않았는 토큰:
HTTP/1.1 401Set-Cookie: JSESSIONID=316DCFD55C302A8D69EFD865411DFA77; Path=/; HttpOnlyWWW-Authenticate: BearerX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockCache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: 0X-Frame-Options: DENYContent-Length: 0Date: Thu, 09 Jan 2020 15:46:34 GMT
그것을 다시 테스트,지금 전달하는 토큰:
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello
일했다! 와 같이 다른 서비스,그 결과의 이 명령은 다음과 같다:
Hello, [email protected]!
봄 부팅 시계에서의 최소 금액에 필요한 코드: 17 줄의 자바와 1 줄의 구성 만! 봄은 항상 개발자의 삶을 편하게 만드는 데 뛰어나므로 놀랄 일이 아닙니다.
그게 다야! 세 가지 프레임 워크 모두에서 기본 Java REST API 를 구현했습니다!
Java 를 사용한 REST Api 에 대한 최종 생각:Micronaut,Quarkus 및 Spring Boot
REST API 를 개발할 때 세 가지 프레임 워크 모두 작업을 잘 수행했습니다. 약간의 코드와 일부 구성 만 있으면 Okta 및 OAuth2.0 을 사용하여 안전한 응용 프로그램을 개발할 수있었습니다.
봄은 수년 동안 주변에 있었고 널리 보급되어 있으며 생태계 주변에 많은 기능을 가지고 있습니다. 개인적으로,나는 여전히 자바로 프로그래밍 할 때 사용할 수있는 최선의 선택이라고 생각합니다.
Micronaut 과 Quarkus 는 인기가 높아지고 Java 커뮤니티 내부에서 추진력을 얻고 있습니다. 당신이 직면하는 성능 문제 또는 어쩌면 당신은 아프,변화를 줄 수 있습니다 그들 중 하나를 시도하고 확인하십시오.
성능은이 세 가지 프레임 워크 사이에서 가장 자주 강조되는 비교 지점입니다. 을 찾고 있다면 빠른 시작에서 서버를 사용하지 않는 환경을 만들 수있는 능력을 기본 이미지 GraalVM,Micronaut 및 Quarkus 가능성이 잘 작동한다. 그냥 재미를위한,시작 시간에 대한 각각의 이러한 앱은 다음과 같습니다(평균을 기준으로 세 가지 시도가):
- Micronaut:474ms
- Quarkus:1132ms
- 봄 부팅:1014ms
나이는 숫자에서 실행하는 각 프레임워크의 Maven 목표로 합니다.
- Micronaut:
./mvnw mn:run
- Quarkus:
./mvnw compile quarkus:dev
- 스프링 부트:
./mvnw spring-boot:run
이러한 명령어에 최적화되어 있지 않은 속도로,그래서 내가 패키지로 각 응용 프로그램./mvnw package
java -jar
.
- Micronaut:596ms
- Quarkus:658ms
- 봄 부팅:1878ms
참고:이러한 숫자가 계산에 2019MacBook Pro with2.4GHz8-Core Intel Core i9CPU 와 64GB RAM. OpenJDK15 는 noJAVA_OPTS
설정과 함께 사용되었습니다.더 빠른 시작 시간을 찾고 있다면 GraalVM 을 사용할 수 있습니다. 타이밍 테스트를 직접 실행하기보다는 각 프로젝트의 문서를 살펴 보았습니다.
- Micronaut:첫 번째 Micronaut Graal 응용 프로그램을 만드는 것에 따라 12ms.
- Quarkus:Quarkus 및 GraalVM 에 따라 14ms:Infoq 에서 초음속,아 원자 크기로 최대 절전 모드로 부팅합니다. Quarkus 문서는 시작 시간을 나열하지 않습니다.
- Spring Boot:spring Graal Native0.6.0 에 따르면 44ms 가 출시되었습니다.
결국,당신은 생산적으로 당신이 만드는 선택에 관계없이 안전한 응용 프로그램을 개발할 수있을 것입니다.
소스 코드를 살펴보고 싶습니까? Okta-java-rest-api-comparison-example 에서 GitHub 에서 찾을 수 있습니다.
Java,REST Api 및 보안 응용 프로그램에 대해 자세히 알고 싶습니까? 여기에 몇 가지 다른 게시물에게서 우리의 블로그는 유용할 수 있습니다.
- 시계 GraalVM 설 Java 로 바이너리
- OAuth2.0Java 가이드: 안전 5 분에서 응용 프로그램
- Java 마이크로 서비스와 함께 봄 부팅 봄 클라우드
- 을 개발하는 방법 Quarkus 앱으로 자바와 그룹이 필요한 인증을
- 간단한 인증과 함께 봄 Security
에 대한 더 많은 게시물이 하나처럼 따라@oktadev 트위터에 있습니다. 우리는 또한 정기적으로 우리의 유튜브 채널에 스크린 캐스트를 게시!이 응용 프로그램을 사용하면 다음과 같은 작업을 수행 할 수 있습니다. Github 의 예제 앱의 코드 변경 사항을 참조하십시오. 이 게시물에 대한 변경 사항은 oktadeveloper 에서 볼 수 있습니다/okta-블로그#423.
java -jar
에 대한 시작 시간이 추가되었으며 GraalVM 으로 실행 중입니다. 이 문서에 대한 변경 사항은 oktadeveloper 에서 볼 수 있습니다/okta-블로그#304.