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

김문수님의 프로필 이미지

작성한 질문수

스프링 기반 REST API 개발

안녕하세요 기선님! oauth2서버와 리소스 서버 연동과 관련된 질문이 있습니다.

해결된 질문

20.05.02 19:24 작성

·

278

0

안녕하세요 강좌를 듣고 oauth2서버와 리소스 서버의 분리를 시도하고 있는데요. 서버가 분리되기 때문에 oauth2서버에서 access token을 발급받은 후에 사용자 정보를 사용하기 위해서는 두 서버의 세션이 공유되어야 할 것이라고 생각했습니다. 그래서 현재 redis기반으로 spring session을 도입했습니다. 

그런데 리소스 서버가 oauth2 서버로부터 access token을 받아도 redis에 사용자 정보가 추가되지 않고 있습니다.

제 생각에는 sessionAttributes에 사용자 정보가 들어가야 할 것 같은데..

연동이 안 되어서 그런 것인지 싶어서 HttpSession의 setAttribute로 세션 데이터를 set하는 핸들러를 임의로 만들어서 테스트를 해본 결과 이 경우에는 redis에 해당 key에 대한 value가 잘 저장되는 것을 확인했고 oauth2서버, 리소스 서버 어디에서 접근해도 다 값을 가져올 수 있었습니다. 

제가 궁금한 것은 우선 이렇게 인증 서버와 리소스 서버가 분리된 경우 spring session을 이용해서 세션을 공유해서 사용자 정보에 접근하는 것이 올바른 방법인지와 만약 그렇다면 현재 제가 어떤 부분을 놓치고 있어서 사용자 정보가 세션에 저장되지 않는지가 궁금합니다.

답변 2

0

김문수님의 프로필 이미지
김문수
질문자

2020. 05. 03. 01:27

답변 정말 감사드립니다. 저도 질문 올린 후에 좀 더 디버깅을 해보니 말씀해주신 것처럼 인증 서버는 토큰 발급을 하고 리소스 서버에서는 OAuth2AythenticationManager를 이용해서 토큰을 기반으로 security context를 가져올 수 있다는 것을 확인했습니다. 제가 계속 security context를 세션에서만 가져온다고 잘못 생각해서 이상한 방향으로 왔네요. 정말 답변 감사합니다! 

0

백기선님의 프로필 이미지
백기선
지식공유자

2020. 05. 03. 00:19

스프링 세션의 용도를 잘못 이해하신거 같습니다. 인증 서버와 리소스 서버 간에 인증 정보를 공유해야 하는건지도 이유를 모르겠스빈다. 인증 서버는 stateless 아닐까요? 들어오는 인증 요청이 정확하면 토큰을 주고 아니면 에러를 던지는 식이니까요. 리소스 서버는 stateless 또는 statefull 모두 구현하기 나름이지만, statefull하게 구현할거고 리소스 서버를 여러개를 운영할꺼라면 리소스 서버에 스프링 세션을 적용하는게 어울리겠네요.