작성
·
595
·
수정됨
0
안녕하세요 수원님 ! 강의를 수강하다가 헷갈리는 내용이 생겨 질문드립니다 !
위와 같은 그림을 설명하실때, 스프링 서버는 Client 의 역할을 하신다고 하셨습니다. 이후 Resource Server 를 강의하시는 파트에서는 스프링 서버가 리소스 서버가 된다고 하셨는데, 이 부분에서 혼동이 발생하여 질문드립니다. 카카오와 같은 소셜 로그인 기능을 구현한다고 가정하겠습니다.
스프링 서버가 JWT 의 의존성을 갖고, 프론트에게 토큰을 발행해주는 서비스를 구현한다면, 이때 스프링 서버는 Client 와 Resourse Server 의 역할을 동시에 하는 것일까요??
위와 같은 구조에서 토큰을 프론트에 발행할 때, 스프링은 카카오 인가 서버로 부터 토큰을 받고 해당 토큰을 그대로 내려주는 것일까요?? 보안상 문제가 발생하니 발급 받은 토큰을 기반으로 새로운 JWT 생성해서 내려주는 것일까요??
소셜 로그인을 연동했다면, issuer-uri 에는 카카오의 인가 서버 Url 을 입력 하면 될까요??
답변 2
1
1.스프링 서버가 JWT 의 의존성을 갖고, 프론트에게 토큰을 발행해주는 서비스를 구현한다면, 이때 스프링 서버는 Client 와 Resourse Server 의 역할을 동시에 하는 것일까요??
음.. 그렇긴 합니다. 다만 Client 나 Resource Server 의 역할은 OAuth2 스펙에서 정의한 내용이라서 단순히 JWT 토큰을 발행한다고 해서 OAuth2 의 흐름과 동일하게 해석할 수 있을 지는 모르겠습니다.
넓은 의미의 Resource Server 로 본다면 OAuth2 와는 무관하게 클라이언트가 요청하는 자원자체를 의미하므로 Resource Server 와 Client 의 역할을 같이 한다고 볼 수 있습니다.
2.위와 같은 구조에서 토큰을 프론트에 발행할 때, 스프링은 카카오 인가 서버로 부터 토큰을 받고 해당 토큰을 그대로 내려주는 것일까요?? 보안상 문제가 발생하니 발급 받은 토큰을 기반으로 새로운 JWT 생성해서 내려주는 것일까요??
스프링 시큐리티의 흐름에 대해 질문하시는 건가요? 좀 더 자세한 설명 부탁드립니다.
3.소셜 로그인을 연동했다면, issuer-uri 에는 카카오의 인가 서버 Url 을 입력 하면 될까요??
네 맞습니다. 카카오의 인가서버 url 을 입력하시면 됩니다.
다만 한가지 유의하실 점은 issuer-uri 을 설정하게 되면 스프링 부트가 초기화 되면서 자동으로 issuer-uri 에 설정된 주소로 연결해서 카카오 인가서버와 관련된 메타 데이터를 가지고 오게 됩니다. 근데 만약 서버가 인터넷이 되는 망이 아닌 인터넷이 안되는 망에 있을 경우 연결실패로 인해 서버 기동이 실패하게 됩니다.
참고하시기 바랍니다.
0
Spring 서버를 Resource Server 로 볼 수 없다면, Spring 에서 제공하는 spring-boot-starter-oauth2-resourse-server 라이브러리는 어떤 기능을 구현하기 위해 필요한 것일까요?? 처음에는 Spring 서버를 Resource Server 로 만들기 위해 필요하다는 것이라고 생각했는데, 수원님의 답변에서 Spring 서버는 Resource Server 로 볼 수 없다고 말씀하셔서 혼란이 오는 것 같습니다 !
1번 질문에서 파생되는 의문인 것 같습니다! 아래의 Sequence 다이어그램을 보면, Spring 은 별도의 인가 인증 서버(카카오)에서 토큰을 발급받고, 이 토큰을 활용하여 사용자 정보를 가져옵니다. 받아온 사용자 정보는 Spring 서버에 저장하고 별도의 JWT 를 발급하여 프론트에 생성한 JWT 를 내려줍니다. 프론트는 이 JWT 를 통해서 사용자 정보를 가져오게 되고, 이를 최종 사용자에게 보여줍니다. 이러한 흐름 속에서 결국 JWT를 발급해주는 Spring 서버의 경우, 자기 자신이 Resource Server 가 되기 위함이 아니라 단순히 JWT를 새로 생성하고 발급하기 위해 resource-server 라이브러리를 의존했다고 보면 될까요??
1번 질문 답변
먼저 질문에 대한 답변은 제가 해석하는 개인적인 의견일 수 있기 때문에 반드시 정답이라고 할 수 는 없으니 참고해 주시기 바랍니다. 다만 최대한 공식 문서나 표준명세서를 바탕으로 의견드리는 것임을 말씀드립니다.
어떻게 보면 리소스 서버라는 의미는 어떤식으로 정의할 것이냐에 따라 달라질 수 있습니다.해당 강의에서 설명하는 리소스 서버는 OAuth2 스펙에서 정의하고 있는 리소스 서버를 의미합니다.
클라이언트, 사용자, 리소스서버, 인가서버로 총 4개의 역할을 통해 OAuth2 의 기능이 완성됩니다. 그렇다면 스프링 시큐리티에서 제공하는 리소스 서버 모듈은 어떤 목적으로 사용하기 위함일까요? 리소스 서버를 OAuth2 용이 아닌 일반 보안용으로 사용해도 크게 무리는 없습니다. 하지만 리소스 서버 모듈에는 인가서버와 통신해서 토큰을 검증하거나 자체 토큰을 검증하는 등의 기능이 있습니다. 그외에도 OAuth2의 스펙에 따라 여러기능들을 담고 있습니다.
만약 리소스 서버 모듈을 OAuth2 용으로 사용하지 않을 것 같으면 굳이 이 모듈이 필요있을까요? 우리에겐 가장 일반적이고 통합적인 스프링 시큐리티 프레임워크가 있고 이것을 사용하면 더욱 훌륭한 리소스 서버를 구현할 수 있습니다. 대신 OAuth2 기능은 없습니다.
제가 Spring 서버를 Resource Server 로 해석함에 있어 물음표를 던진것은 OAuth2 표준사양에서 명시하고 있는 Resource Server 명세를 볼 때 리소스 서버는 클라이언트에게 권한을 제공하는 인가서버기관에 속한 리소스 서버를 의미기 때문입니다. 즉 클라이언트의 백엔드 서버로 구축된 리소스 서버를 의미하는 것이 아니라고 생각하기 때문입니다.
물론 클라이언트의 백엔드 서버도 리소스 서버로 활용할 수 있고 리소스 서버가 맞습니다. 하지만 스프링 시큐리티에서 제공하는 리소스 서버 모듈은 클라이언트 백엔드의 리소스서버를 구축하기 위한 목적이 아니라 Access Token 을 발급하는 인가기관의 리소스 서버를 구축하도록 제공하는 모듈이라 할 수 있습니다. 그래서 만약 OAuth2토큰을 발급하는 인증서버까지 자체적으로 구축한다면 Spring 서버를 Resource Server 로 사용해도 무방합니다.
그럼에도 불구하고 인증서버와 무관하게 리소스 서버 모듈을 클라이언트의 백엔드 보안 서버로 사용한다 해도 문제 될 것은 없습니다. 구현상 문제만 되지 않으면 되니까요. 저는 OAuth2 명세서를 기준으로 리소스 서버의 정의와 역할에 대해 말씀 드린거라 보시면 됩니다.
2번 질문 답변
네 정확하게 인지하고 계신 것 같습니다.
OAuth2 표준의 리소스 서버가 아닌 단지 클라이언트에서 리소스 서버로 활용하고자 리소스 서버 모듈을 사용한다고 보시면 될 것 같습니다.