작성
·
1.2K
1
KeyCloak 을 인가서버로 활용하고
Resource 자원 사용하는 Data API
인가 처리를 하는 Auth API (Gateway) 를 구현해서 진행하고 있습니다.
그런데 너무 여러가지 방식이 많다보니 혼돈이 와서 선생님이 가르쳐주신 방식으로 인가와 인증을 구현하려고하는데,
인가 서버 -> KeyCloak 사용
게이트 웨이에 Oauth2 를 넣으려고 하는데 개념적으로 궁금한 점이 있어 여쭤봅니다.
공개 클라이언트 방식과 기밀 클라이언트 가 구현함에 있어 어떤 차이를 가지는지 의문입니다.
가령 react -> KeyCloak 요청 시
token 을 바로 가져오려고 하는데, 이 토큰을 받는 것 까진 문제가 없습니다. 하지만 영상에서 보여주신 것과 같이 자원 API 로 접근하는 권한을 획득하기 위해서 기밀 클라이언트 방식으로 구현하면
code 를 리다이렉트 받은 uri 와 token 요청시 리다이렉트 uri 가 같아야하는 문제가 있어서 code 를 auth api 로 받은 뒤 토큰 엔드포인트를 찍어 스프링 프로젝트에서 가져올 때 오류가 발생합니다.
react -> keycloak -> code 반환 받은 것 -> spring -> redirect uri 문제로 토큰 발급 불가
가 되는데 어떤 형식으로 처리해야 맞는 것인지 궁금합니다.
답변 2
0
오 감사합니다. 흐름적인 관점의 질문이 맞습니다. 친절한 답변 감사합니다. 가르쳐주신것 토대로 구현해보겠습니다.!
한가지 더 여쭤보고 싶은게 있다면
react 8081 , gateway 8080 , keycloak 8090 일때
react -> keycloak 인가서버에 코드 요청 (8090) -> redirect url (Gateway API 8080) 코드 받고 -> security login 처리 및 code 인가서버로 보내고 (return 할 토큰받기 위해) keycloak 요청 -> token 리턴
이 맞나요
0
음..
react 에서 keycloak 로 바로 code 를 요청하는 건가요? 아니면 react 에서 시큐리티를 거쳐서 keycloak 로 code 를 요청하는 건가요?
클라이언트 스크립트 단에서 인가서버로 code 요청을 하고 나서 리다이렉트로 code 를 반환받을 때 클라이언트의 서버 즉 시큐리티에서 code 를 받게끔 구성하시면 될 것 같습니다.
질문의 의도를 제가 정확하게 이해하지 못한 것일 수도 있는데 토큰을 요청할 때 redirect_uri 를 보내는 것은 이전의 단계에서 보낸 redirect_uri 와 동일한 값인지 인가서버에서 검증하는 것일 뿐 인가서버가 토큰을 발급할 때 클라이언트로 다시 리다이렉트 하지는 않습니다.
시큐리티 내부적으로 restTemplate 로 인가서버와 통신하고 토큰을 응답받도록 되어 있습니다.
개인적인 의견은 게이트웨이의 react 에서 바로 인가서버로 code 요청을 하기보다는 시큐리티를 거쳐서 인가서버와 통신해서 code 및 토큰을 받아오고 이 토큰 정보는 인증객체에서 언제든지 참조가 가능하기 때문에 다른 서버로 접근할 때 헤더에 실어서 전달 가능할 것입니다.
대략 다음과 같습니다.
user -> gateway -> react -> spring security -> keycloak -> code 반환(redirect_uri)
gateway -> spring security -> keycloak -> token 획득 -> api 서버
이 때 gateway 는 스프링 시큐리티의 OAuth2 Client 역할을 하게 됩니다.
제가 잘 못 이해한 것일 수 있으니 조금 더 자세히 설명해 주시면 고맙겠습니다.
네
그렇게 해도 되고 react -> keycloak 인가서버에 코드 요청 (8090) 를
react -> gateway 8080(security) -> keycloak 인가서버에 코드 요청 (8090) 로 하셔도 됩니다
첫번째 방식은 클라이언트에서 바로 인가서버로 코드를 요청하는 것이고 두번째 방식은 클라이언트에서 시큐리티에게 코드요청을 위임하는 것입니다
두가지 방식 다 가능할 것 같은데 테스트 해보시면서 서비스 환경에 알맞은 방식을 선택하시면 될 것 같습니다