지금까지 저희는
Keycloak 인증 서버를 구축하고
리소스 서버를 구축하였으며
Keycloak 서버 내부에
클라이언트 정보도 생성하였습니다
client credentials grant type flow를 이용하여
API간 커뮤니케이션을 시행하기 위해서는
우선 Keycloak 인증 서버로부터
액세스 토큰을 받은 다음 그 토큰을
리소스 서버에 넘겨서
성공했다는 반응을 받아야 합니다
여기서 Postman을 이용하여
먼저 액세스 토큰을 받기 위한 정보를 모두 가지고
인증 서버에 인증 요청을 보내야 합니다
그런데 액세스 토큰을 받기 위해
Postman으로부터 어떤 URL을 호출해야 하는 걸까요?
여기 있는 URL이
Keycloak 서버에 관한 중요한 URL들에 대해
이해하는 데 필요한 것입니다
GitHub 저장소 페이지에도
여러분이 볼 수 있도록 이 URL을 올려 놓겠습니다
여기 보시면 Keycloak 인증 서버로부터
JSON 응답을 받았습니다
그리고 중요한 URL은 모두 여기에 있습니다
확대를 해 보겠습니다
그래서 여기에 있는 세 번째 URL
token_endpoint를 보시면
이 URL이 바로 Keycloak 인증 서버로부터
토큰을 받는 데 필요한 URL입니다
이와 유사하게 이 jwks_url은
application.properties 내부에서
리소스 서버가 Keycloak 서버의 공용 인증서를
이 URL을 이용하여 다운로드할 수 있도록 할 때
사용되는 것입니다
또한 grant_types_supported와 같은
중요한 정보도 담고 있습니다
다른 정보도 아주 많습니다
혹시 관심이 가신다면
어떤 정보인지 찾아보실 수 있습니다
다만 지금은 이 endpoint에만 주목합시다
이건 token endpoint입니다
이 값을 복사하겠습니다
그리고 만약을 위해 언급하자면 이 JSON 응답이
제 브라우저에 올바르게 포맷이 돼 있는 건
제가 JSONVue Chrome 확장 프로그램을 사용하고 있기 때문입니다
그러므로 여러분도 Chrome 안에
이 확장 프로그램을 다운로드 하시길 바랍니다
그러지 않으면 raw JSON을 얻게 되는데
그 형식의 데이터는 해석하기 아주 복잡하기 때문입니다
그럼 이 토큰 URL을 복사해 볼게요
그리고는 Postman으로부터
제 인증 서버에 액세스 토큰 요청을 보내겠습니다
이 요청은 HTTP POST의 도움을 받아 보내야 합니다
지금은 Postman을 사용 중이지만 실제 상황을 상상해 보세요
현실에서는 이 URL을 호출하여
액세스 토큰을 요청하는 것은
서드 파티 애플리케이션입니다
여기 있는 쌍따옴표는 제거하겠습니다
그럼 Body 탭에서
x-www-form-urlencoded를 선택해야 합니다
그 다음에는 인증 서버에게
보내줘야 하는 정보가 있습니다
가장 먼저 보내고 싶은 정보는
client_id 두 번째는 client_secret
그리고 세 번째는
scope 값입니다
마지막으로 입력해야 하는 건
grant_type입니다
Client_id가 무엇이냐면 Keycloak 관리자 콘솔에서
Clients를 열어 보시면
저번에 생성했던 클라이언트 정보입니다
이 값을 가져다가 쓰겠습니다
client_id 키도 똑같이 하면 됩니다
client_secret도 똑같은 방법으로 가져오면 됩니다
클라이언트 secret을 가져왔습니다
클립보드로 복사한 다음 붙여 넣습니다
그 다음 scope은
OpenID 형식의 객체를 입력한다는 점에 주의합시다
다른 형식으로 하면
인증 서버로부터 토큰을 받지 못합니다
OpenID 외에 다른 유형의 scope
예를 들자면 이메일, 프로필, 주소 등도 언급할 수 있습니다
각각의 scope는 스페이스로 분리해야 한다는 점에 주의하세요
마지막으로 grant_type는
client_credentials 객체로 입력해야 한다는 점에 주의해야 합니다
이게 저희가 client credentials grant flow를 이용할 때마다
넘겨야 하는 증명 타입이 되는 겁니다
그리고 저희는 CSRF 토큰은 넘길 필요가 없습니다
왜냐면 API들이 커뮤니케이션을 할 때에는
브라우저하고는 연관이 없기 때문입니다
그리고 브라우저를 거치지 않는다면
CSRF 공격은 발생할 이유가 없기 때문입니다
이 입력으로 Send를 눌러 보겠습니다
성공적으로 액세스 토큰과
ID 토큰을 받았으며
이 액세스 토큰은 300초 후에 만료될 겁니다
그 전에 JWT 웹사이트에서
이 토큰을 유효화합시다
JWT 웹사이트 내부에서 액세스 토큰을 붙여넣습니다
그리고 액세스 토큰의 내용을 보면
realm_access라는 키를 가진 데이터가 있습니다
이 내부에는 roles라는 map이 있으며
이것들이 roles 값입니다
이게 바로 저희가 반환한
KeycloakRoleConverter class에서 변환하려 하는 정보입니다
그 class
즉 KeycloakRoleConverter를 열어보시면
realm_access 키를 이용하여
Claims 데이터를 얻고자 한다는 것을 알 수 있습니다
여기에도 마찬가지로 realm_access가 있습니다
그리고 이 내부에는 roles라는 키의 map이 있습니다
roles 내부에는 인증과
역할 정보가 들어 있고요
그래서 역할 정보를
roles라는 키로 읽으라고 여기 되어 있는 겁니다
다음으로 ROLE_을 객체 이름 앞에 붙이고
객체를 SimpleGrantedAuthority 객체로 변환하는
로직이 있습니다
그런데 여기에는 문제가 있습니다
지금은 역할 이름 중에
user와 admin이 없습니다
그런데 ProjectSecurityConfig을 보면
저희는 endpoint를 전부
USER 와 ADMIN이라는 이름으로 설정해 두었습니다
이걸 어떻게 해결하냐면
지금 저희는 Keycloak 인증 서버의 관리자이므로
역할을 새로 만들고
클라이언트 애플리케이션에게 만든 역할을 할당할 수 있습니다
역할을 설정했듯이
Keycloak 관리자 콘솔로 가면
Realm roles라는 설정이 있습니다
그걸 클릭할게요
그러면 이 페이지에는 Create role이라는 버튼이 있습니다
이걸 클릭한 다음
USER라는 이름의 역할을 생성하고 싶습니다
Save를 누릅니다
그 다음 역할을 하나 더 생성합니다
Realm roles로 돌아가서
Create role을 클릭합니다
두 번째로 생성하고 싶은 역할은 ADMIN입니다
저장합니다
역할이 정상적으로 생성되었는지
이 페이지를 통해 확인할 수도 있습니다
ADMIN과 USER는 성공적으로 생성되었네요
저는 방금 역할을 생성했지만
클라이언트에게 역할을 할당하지는 않았습니다
그러므로 Clients로 가서
eazybankapi 클라이언트를 엽니다
그러면 이 메뉴에는 Service accounts roles라는 탭이 있습니다
Roles 탭으로 가면 안 됩니다
왜냐면 Roles는 실사용자의 역할에 관한
설정이기 때문입니다
실사용자에게 역할을 할당할 때 쓰는 겁니다
하지만 eazybankapi 클라이언트는
API 간 커뮤니케이션에 사용되는
서비스 계정(Service account)입니다
그러므로 Service account roles로 가서
설정을 해야 합니다
그러면 이 탭에서는 Assign role을 클릭하고
원하는 역할을 모두 선택합니다
아까 생성한
ADMIN과 USER를 선택합니다
Assign을 클릭합니다
이걸로 클라이언트는 이 역할들을 할당받았습니다
이제 이 token endpoint를 다시 호출해 보면
이번에는 새로운 액세스 토큰을 받았습니다
이걸 가지고 JWT 웹사이트로 갈게요
여기에 붙여넣습니다
그리고 이번에는 realm_access에
ADMIN과 USER 역할이 보입니다
이렇게 저희는 아까 생성한 역할을
클라이언트에게 할당하는 데 성공했습니다
비슷한 방법으로 받은 ID 토큰을 유효화합시다
이 ID 토큰을 가져다가
JWT 웹사이트에 붙여넣습니다
그리고 클라이언트 애플리케이션의
정보 예를 들면 clientId 같은 것도 모두 있습니다
clientId는 eazybankapi지요
이 클라이언트를 생성할 때
Keycloak 내부에 주소는 입력하지 않았기 때문에
address는 비어 있습니다
마찬가지로 이메일도 입력하지 않아서
이메일 정보도 없습니다
하지만 상위 정보만 본다면. 이 ID 토큰으로
누구든지 이 정보는 clientId 값이
eazybankapi인 클라이언트 것이라는 것을 알 수 있습니다
client credentials grant type flow로 어떻게
액세스 토큰을 받을 수 있는지 이해가 되셨길 바랍니다
다음 강의에서는 액세스 토큰을
리소스 서버에 넘겨
성공적으로 응답을 받을 수 있도록 해보겠습니다
들어주셔서 감사하며 다음 강의에서 뵙겠습니다
수고하셨습니다