인프런 커뮤니티 질문&답변

jisu3316님의 프로필 이미지
jisu3316

작성한 질문수

스프링 시큐리티 OAuth2

Oauth 2.0 Client Types 이해

안녕하세요 MSA 구성을 진행하고 있는 뉴비 신입 개발자입니다.

작성

·

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

jisu3316님의 프로필 이미지
jisu3316
질문자

오 감사합니다. 흐름적인 관점의 질문이 맞습니다. 친절한 답변 감사합니다. 가르쳐주신것 토대로 구현해보겠습니다.!

 

한가지 더 여쭤보고 싶은게 있다면

react 8081 , gateway 8080 , keycloak 8090 일때

react -> keycloak 인가서버에 코드 요청 (8090) -> redirect url (Gateway API 8080) 코드 받고 -> security login 처리 및 code 인가서버로 보내고 (return 할 토큰받기 위해) keycloak 요청 -> token 리턴

이 맞나요

정수원님의 프로필 이미지
정수원
지식공유자

그렇게 해도 되고 react -> keycloak 인가서버에 코드 요청 (8090) 를

react -> gateway 8080(security) -> keycloak 인가서버에 코드 요청 (8090) 로 하셔도 됩니다

첫번째 방식은 클라이언트에서 바로 인가서버로 코드를 요청하는 것이고 두번째 방식은 클라이언트에서 시큐리티에게 코드요청을 위임하는 것입니다

두가지 방식 다 가능할 것 같은데 테스트 해보시면서 서비스 환경에 알맞은 방식을 선택하시면 될 것 같습니다

jisu3316님의 프로필 이미지
jisu3316
질문자

감사합니다 강사님 많은 도움이 되었습니다!.

0

정수원님의 프로필 이미지
정수원
지식공유자

음..

react 에서 keycloak 로 바로 code 를 요청하는 건가요? 아니면 react 에서 시큐리티를 거쳐서 keycloak 로 code 를 요청하는 건가요?

클라이언트 스크립트 단에서 인가서버로 code 요청을 하고 나서 리다이렉트로 code 를 반환받을 때 클라이언트의 서버 즉 시큐리티에서 code 를 받게끔 구성하시면 될 것 같습니다.

질문의 의도를 제가 정확하게 이해하지 못한 것일 수도 있는데 토큰을 요청할 때 redirect_uri 를 보내는 것은 이전의 단계에서 보낸 redirect_uri 와 동일한 값인지 인가서버에서 검증하는 것일 뿐 인가서버가 토큰을 발급할 때 클라이언트로 다시 리다이렉트 하지는 않습니다.

시큐리티 내부적으로 restTemplate 로 인가서버와 통신하고 토큰을 응답받도록 되어 있습니다.

개인적인 의견은 게이트웨이의 react 에서 바로 인가서버로 code 요청을 하기보다는 시큐리티를 거쳐서 인가서버와 통신해서 code 및 토큰을 받아오고 이 토큰 정보는 인증객체에서 언제든지 참조가 가능하기 때문에 다른 서버로 접근할 때 헤더에 실어서 전달 가능할 것입니다.

대략 다음과 같습니다.

  1. user -> gateway -> react -> spring security -> keycloak -> code 반환(redirect_uri)

  2. gateway -> spring security -> keycloak -> token 획득 -> api 서버

이 때 gateway 는 스프링 시큐리티의 OAuth2 Client 역할을 하게 됩니다.

제가 잘 못 이해한 것일 수 있으니 조금 더 자세히 설명해 주시면 고맙겠습니다.

 

jisu3316님의 프로필 이미지
jisu3316

작성한 질문수

질문하기