• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Spring Boot 를 이용해 JWT + Social 로그인 처리 질문 있습니다.

22.12.25 23:50 작성 22.12.26 00:11 수정 조회수 1.46k

1

안녕하세요. 우선 좋은 강의 제공 해주셔서 감사드립니다 :)

 

이번에 회사에서 신규 프로젝트로

  1. Client Server (Vue, React, Android, IOS)

  2. Back Server (Spring Boot)

해당 언어로 구성하기로 결정 되었습니다.

 

신규 프로젝트에 있어서 가장 중요한 부분이 인증 및 인가 시스템인데요.

여기서 우리는 JWT + Spring Security 를 사용하기로 결정되었고

특히 Social Login 경우 Grant Type 을 "Authorization Code Grant Type" 을 이용하기로 했습니다.

아무래도 Authorization Code Grant Type 이 가장 안전하기 때문 입니다.

 

앞써 말씀드렸지만 Client Server 를 vue, react, Android, ois 를 이용 계획이고

Authorization Code Grant Type 을 동시에 이용하면서 인증 처리 할 예정인데요.

 

인증이 성공적으로 완료된다면 자체적으로 JWT 토큰을 생성해서 Access Token 을 만들고 Client 서버 에게 반환 해서 반환 받은 Client 서버들을 Resouce Server 에서 자원을 요청 하는 시스템입니다.

 

우선 이미지를 보면서 시나리오를 설명 드리도록 하겠습니다.

 

  • 일반 로그인

1111.PNG

  1. A 사용자가 아이디 하고 패스워드를 입력 후 Authorization Server(Spring Boot) 로 전송한다.

     

  2. 인증 처리가 완료 되면 A 사용자 그러니깐 Client 서버에게 자체적으로 JWT Token 을 만들어서 Access Token을 전송한다.

     

  3. Client Server 는 자체적으로 만든 JWT Token (Access Token) 을 쿠키에 저장 하고 Resource Server 에 요청 한다.

 

  • Social 로그인

22222.PNG

  1. Client 서버 접속한 사용자는 KaKao 소셜 로그인 버튼을 클릭한다. (요청 파라미터는 카카오로 부터 제공 받은 client_id, redirect_uri + response_type 을 'code' 로 지정한다.)

     

  2. KaKao Authorization Server 는 요청 받은 파라미터로 Client 식별하고 사용자에게 kakao 로그인 페이지를 보여드린다. 생략 되었지만 인가 처리되었다면 임시 코드값을 지정한 redirect uri 통해 client server 로 전송한다.

     

  3. 임시 코드를 받은 Client Server 는 자체적으로 구축한 Authorization Server(Spring Boot) 로 전송한다.

     

  4. 임시 코드를 전송 받은 데이터와 client_id, client_secret, response_type 함께 KaKao Authorization Server 로 요청한다 (Access Token 받기 위해)

     

  5. 인증이 완료되면 KaKao Authorization Server 는 Authorization Server(Spring Boot) 로 인가처리가 완료되었음을 의미하는 Access Token 만들어 전송한다.

     

  6. Access Token 을 발급 받은 Authorization Server(Spring Boot) 서버는 해당 Access Token 을 이용해서 인증 처리하기 위해 KaKao Authorization Server 로 요청한다.

     

  7. 인증 처리 완료되었다면 해당 접속자의 유저 정보를 전송 한다.

     

  8. 해당 유저 정보를 이용해서 회원 가입 프로세스 처리 동시에 자체적으로 JWT Token (Resource Server 접근 하기 위한) 을 생성해서 Client Server에 반환 한다.

     

  9. Client Server 는 자체적으로 만든 JWT Token (Access Token) 을 쿠키에 저장 하고 Resource Server 에 요청 한다.

 

선생님 강의에서는 Client Server 경우 Spring Boot Security 을 이용했던거와 달리

클라이언트 서버 경우 Vue, React, Android, IOS 사용 할려고 합니다.

그리고 Grant Type 을 "Authorization Code Grant Type" 사용 하기 때문에 일반 로그인 경우는 문제가 없는데

Social 로그인 경우 프로세스를 어떻게 하면 잘 구성 될지 제 나름대로 고민을 해보았습니다.

 

Implicit Grant Type 경우를 사용하면 쉽게 처리 할 수 있을것 같은데

Grant Type 을 "Authorization Code Grant Type" 사용 할려다 보니 많이 복잡해지고 이렇게 작동이 될지 의문도 들고 이런 저런 생각이 드네요.

또한 Client Server 경우 절대로 client_secret 을 노출 해서는 안되다는 점 제한으로 이러저런 구성하는데 힘이 좀 들었습니다

한번 선생님에게 제가 구상한 프로세스를 피드백 받고 싶어 이렇게 질문 드립니다.

 

항상 소중한 강의 제공해주셔서 감사드리고 답변 부탁드립니다.

 

감사합니다 :)

 

 

 

 

 

 

답변 1

답변을 작성해보세요.

5

음..

일단 제가 생각하는 구조는 대략 이렇습니다.

imageClient 가 카카오나 구글로 바로 권한부여 요청을 하는 것이 아닌 스프링 시큐리티의 OAuth2 Client 에게 소셜 로그인 요청을 하도록 위임 합니다. 근데 만약 스프링 시큐리티의 OAuth2 Client 기능을 사용하지 않고 Client 에서 직접 자바스크립트 등으로 권한부여 요청을 한다면 크게 문제 될 것은 없으나 그렇게 되면 Authorization Code 방식의 권한 부여 방식을 스프링 시큐리티의 기능을 사용하지 않고 모든 권한 부여 흐름을 모두 구현해야 합니다.

리나님께서 언급하신 SpringBoot 기반의 Authorization Server 가 Social Provider 와의 통신을 통해 클라이언트의 권한 부여 과정과 인증과정을 책임진다면 결국 OAuth2 Client 의 역할과 비슷할 것 같은데 굳이 Client 가 Social Provider 에게 바로 권한 부여 요청을 하고 code 를 받은 후에 다시 Authorization Server 에게 전달해서 이후 권한부여 승인 과정을 거치는지 특별한 이유가 있는지 모르겠습니다.

리나님께서 구성하는 설계도에서 SpringBoot 기반의 Authorization Server 를 OAuth2Client 모듈로 대체하는 것 외에는 다른 점은 없습니다.

그리고 OAuth2 Resource Server 의 정확한 용도는 현재 사용자가 속한 시스템 내의 자원을 가져오기 위한 서버로서의 역할입니다.

즉 여기에서는 Social Provider 에 속한 사용자를 의미하고 Social Provider 의 Resource Server 를 의미합니다.

즉 Social 인증이 다 완료된 이후에 별도의 JWT 토큰을 만들어서 Client 시스템 내에서의 인증상태를 체크하고 및 자원에 대한 접근을 제어하기 위한 목적이라면 그건 엄밀히 말해서 OAuth2 Resource Server 가 아닌 Client 의 API 서버가 더 정확한 표현이라 할 수 있습니다.

그렇지만 Client 에서 본래의 목적이나 취지를 떠나 스프링 시큐리티의 OAuth2 Resource Server 의 기능을 활용한다 하더라도 문제될 것은 없습니다.

그러나 OAuth2 Resource Server 에서 제공하는 OAuth2 Authorization Server 와의 연동을 통한 다양한 기능을 사용하지 못한다는 단점은 존재합니다.

스프링 시큐리티에서 제공하는 큰 3개의 그림인 OAuth2 Client, OAuth2 Resource Server, OAuth2 Authorization Server 는 각 모듈이 독립적으로 운용이 되지만 상호 연동을 통한 시너지를 극대화 할 수 있기 때문에 상황에 맞게 잘 활용하는 방법을 익히는 것이 중요하다 할 수 있습니다.

리나님의 프로필

리나

질문자

2022.12.28

답변 감사합니다!

그런데 1번 그다음 OAuth2Client Server 에서 Social Provider 서버로 (KaKao Server) 2번 권한 부여 요청시

Social Provider 서버로 응답으로 KaKao 로그인 페이지가 열리지 않을까요?

 

그러면 실질적으로 사용자 유저는 Client Server에서 접속 중인데 Social Provider 서버 에서 KaKao 로그인 페이지 관련 응답받게 된다면 사용자 유저는 확인을 못 할것 같은데요 ㅠ.ㅠ

 

아닌가요? ㅠㅠ