Spring Secuirty 20 OAuth2
포스트
취소

Spring Secuirty 20 OAuth2

OAuth2

우리는 지난시간에 시큐리티의 기본에 대해서 알아보았다 물론 전부다 알아본것은 아니지만 기본적인 로그인 구현 및 방식부터 해서 직접 어플리케이션을 만들어보고 로그인도 해보았다 오늘부터 하게될 이 OAuth2 라는것은 우리들에게 생각보다 익숙한 기능일것이다

요즘 웹사이트 로그인할때 보면 보통 그 사이트에서 제공하는 로그인 form 방식이 있는 반면에 구글 로그인 카카오 로그인 네이버 로그인 이렇게 대표적인 로그인 버튼들이 있고 그것들을 통해서 우리는 사이트 가입없이 간편하게 로그인을 할 수 있는데 그러한 기술이 OAuth2 이다 우리는 OAuth2 에 대해서 알아볼려고 한다 그리고 제일 마지막에서는 구글 로그인 , 네이버 로그인 , 카카오그인을 개발하는 것으로 OAuth2 에 대한 내용을 마무리 하도록 하겠습니다

OAuth2 는 우리가 앞으로 배울 OAuth2 - Login , OAuth2 - Client , OAuth2 - ResourceServer , OAuth2 - Authorization - Sever 이렇게 큰 기술이 4개나 존재하는데 그중에서 우리는 OAuth2 - Login , OAuth2 - Client , OAuth2 - ResourceServer 이렇게 3개의 기술에 대해서 공부를 해볼 예정입니다

OAuth2 정의

OAuth2 는 웹 모바일 애플리케이션을 위한 권한 부여 프레임워크입니다 주로 서드파티 애플리케이션이 다른 사용자를 대신하여 보호된 리소스에 접근하는데 사용됩니다 이는 클라이언트 애플리케이션이 제한된 사용자의 정보에 보다 안전하게 접근할 수 있게 만들어진 표준 권한 프로토콜입니다

개발환경

JDK 11 이상 Spring boot 2.7.1 keycloak Window11

keycloak

일명 인가서버라고 하는 소프트웨어를 설치할것입니다 이를 통해서 우리는 OAuth2 가 무엇인지에 대해서 천천히 공부를 해볼것입니다 인가서버는 우리가 앞에서 시큐리티를 공부할때는 로그인을 구성하고 이 사람의 권한이 무엇이고 이런것들을 전부 우리가 구현을 해주어야 했지만 앞으로 OAuth2 기술을 쓰게 되면 우리는 로그인이 된 이후만 생각하면 되고 로그인 절차 그리고 User 같은 것은 모두 인가서버에서 해결을 해줄것입니다

  1. 소프트웨어 다운로드 주소

https://www.keycloak.org/archive/downloads-21.0.0.html 저는 원래 19.1 버전으 사용했는데 이전버전이 다 없어진 관계로 21버전을 설치하겠습니다

원래는 최신버전을 쓸려고 했는데 계속 설치를 해서 안되서 찾아보니 현재 20버전 이상에서는 window 에서 첫번째 실행은 되지만 두번째 실행부터는 안된다는 오류가 발견되었습니다 무엇인가 특별한 조치가 없는 관계로 원래쓰던 19.1 버전 링크를 남기겠습니다 https://github.com/keycloak/keycloak/releases/download/19.0.1/keycloak-19.0.1.zip

여기서 알집을 받아준뒤 알집을 풀어줍니다 저는 C 에 풀었습니다 (바탕화면에도 상관 없습니다)

  1. KeyCloak 실행 cmd 터미널 열어서 C:\keycloak-19.0.1\keycloak-19.0.1\bin 여기 까지 들어온뒤
1
2
.\kc.bat start-dev

이렇게 하면 개발모드로 실행이되고 처음 실행하면 버전에 대해서 초기 설정을 진행합니다 (20 버전 이상부터는 이 초기설정에서 계속 오류 발생 구관이 명관…)

  1. 접속

주소가 http://0.0.0.0:8080 나오는데 이는 IPV6 주소이고 이는 http://localhost:8080 으로 접속을 하시면됩니다

2

그러면 이런 초기 화면이 나오는데 제일 왼쪽에 Administration Console 에 초기 아이디 비밀번호를 입력하겠습니다

아무것이나 해도 되지만 저는 admin/1234567890 으로 진행하겠습니다

  1. Administration Console 접속

3

여기에 아까 만들었던 접속계정정보를 입력하겠습니다

  1. Realm 만들기

4

이곳을 클릭하면 파란색 버튼으로 Realm(왕국) 만들 수 있습니다 저희만의 왕국을 만들어보겠습니다

5

왕국의 이름을 짓겠습니다 저는 Srping-Oauth2-Authorizaion-Project 로 짓겠습니다

6

우리만의 왕국이 만들어지게 됩니다

  1. Client 만들기

7

좌측메뉴에서 Client 선택후 나오는 화면에서 파란색 버튼 Create client 클릭 다음에 나오는 화면에서 이름만 필수값임으로 Spring-Oauth2-Authorizaion-client 게 넣어주고 다음클릭

8

그리고 다음에 나오는 설정에서 이렇게 설정을 하고 넘어갑니다 (뒤에 따로 설정할 수 있습니다)

9

그리고 다음에 나오는 화면에서는 다른건 손대는거 없이 Valid redirect URIs 만 http://localhost:8081/login/oauth2/code/keycloak 설정을 하겠습니다 이유는 천천히 설명을 할것입니다

  1. User 생성 이 User 는 이제 우리가 앞으로 사용하게될 간편사용자 아이디입니다

10

왼쪽메뉴에서 user 누르고 create user 클릭한뒤 본인이 원하는대로 설정을 하시면됩니다 그리고 save 누르면 유저가 생성이 됩니다

spring 연동 Maven

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-oauth2-client</artifactId>
	</dependency>
</dependencies>

demoController 만들기

1
2
3
4
5
6
7
8
9
10
@RestController
public class DemoController {
    
    @GetMapping("")
    public String demoController(){
        
        return "demo";
    }
}

application.properties 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server.port=8081

spring.security.oauth2.client.registration.keycloak.clientId=Spring-Oauth2-Authorizaion-client
spring.security.oauth2.client.registration.keycloak.clientSecret=NIe2qftuPcclGWFiBFicEWoK5SfYs7ql
spring.security.oauth2.client.registration.keycloak.redirectUri=http://localhost:8081/login/oauth2/code/keycloak
spring.security.oauth2.client.registration.keycloak.scope=email,profile
spring.security.oauth2.client.registration.keycloak.clientName=Spring-Oauth2-Authorizaion-client
spring.security.oauth2.client.registration.keycloak.authorizationGrantType=authorization_code
spring.security.oauth2.client.registration.keycloak.clientAuthenticationMethod=client_secret_post

spring.security.oauth2.client.provider.keycloak.issuerUri=http://localhost:8080/realms/Srping-Oauth2-Authorizaion-Project
spring.security.oauth2.client.provider.keycloak.authorizationUri=http://localhost:8080/realms/Srping-Oauth2-Authorizaion-Project/protocol/openid-connect/auth
spring.security.oauth2.client.provider.keycloak.tokenUri=http://localhost:8080/realms/Srping-Oauth2-Authorizaion-Project/protocol/openid-connect/token
spring.security.oauth2.client.provider.keycloak.userInfoUri=http://localhost:8080/realms/Srping-Oauth2-Authorizaion-Project/protocol/openid-connect/userinfo
spring.security.oauth2.client.provider.keycloak.jwkSetUri=http://localhost:8080/realms/Srping-Oauth2-Authorizaion-Project/protocol/openid-connect/certs
spring.security.oauth2.client.provider.keycloak.userNameAttribute=preferred_username

저와 Relem 를 같이 입력했으면 이와 같지만 그게 아니라면 자신만의 주소 입력하셔야 합니다 단 Client - Secret 제외

ClientSecret 확인

11

웹에서 이 부분 Client secret 클릭해서 확인 후 붙여넣으시면됩니다

Client ID 확인

현재 spring.security.oauth2.client.registration.keycloak.clientId , spring.security.oauth2.client.registration.keycloak.clientName 에 들어가는 값으로

12

여기에 ClientId 있으니 이 부분을 넣어주시면됩니다 그리고 하단 provider 부분은 아마 저랑 realms 를 똑같이 했다면 위랑 같이 가면되는데 그게 아니라면

provier 값 확인

13

에서 하단 EndPoint OpenID Endpoint Configuration 클릭 그럼 key - value object 가 존재하는데 하나씩 key 를 매핑시켜드리겠습니다

issuerUri -> issuer

authorizationUri -> authorization_endpoint

tokenUri -> token_endpoint

userInfoUri -> userinfo_endpoint

jwkSetUri -> jwks_uri

이렇게 매핑을 시켜주시면됩니다 단 이것은 저랑 realms 달리했을 경우입니다 같이했으면 저랑 같은거 쓰셔도 됩니다 그럼 준비는 끝 기동하겠습니다

localhost:8081/demo 접속

14

우리가 아는 그 시큐리티 기본 로그인창이 나온다고 생각을 했겠지만 현실은 keyClock 에서 제공하는 로그인창이 뜬것이다 여기에 우리는 아까 넣었던 user 정보를 넣겠습니다 만약 비밀번호를 설정안해주셨다면

16 이쪽으로 오셔서 다시 설정을 해주시면됩니다 (ResetPassword) 아니면 파란색 버튼으로 비밀번호 만들 수 있는 버튼이 하나 생성이 됩니다

15

이렇게 넘어오면 성공입니다

우리는 그러면 개념은 다음시간부터 다루고 처음으로 인가서버와 , spring 애플리케이션을 연동을 해보았습니다 앞에서 우리는 인가서버와 그에 해당하는 리소스 서버를 오롯이 우리가 구현을 했다면 이 OAuth2-login , client 방식은 이미 구현이 되어 있는 인가서버를 통해서 로그인 후 권한을 획득 한후 권한에 알맞는 페이지로 인도하게 됩니다

다음시간부터는 이 Oauth2 의 개념부터 차근차근 해보도록 하겠습니다