카테고리 없음

구글, 네이버, 카카오 소셜로그인 구현 1

필라테스선생님 2023. 10. 22.

구글, 네이버, 카카오 소셜로그인 구현 1

프로젝트를 하면서, 로그인을 구현해야하는 단계에 왔을 때, sns로그인을 사용해 간단하게 넘길지 아니면 직접 구현할지 팀원과 의논했다. spring security는 강의에서도 생각보다. 상세하게 다루지 않아, 깊게 공부하려면 아예 따로 spring security강의를 찾거나 레퍼런스를 뒤지면서 처음부터 공부해야했다. 그래도 이왕 하는 김에, 처음부터 머리박으면서 구현해보는게 좋겠다는 생각으로 뛰어들었다. 로그인을 구현할 때, 먼저 세션과 토큰 방법 중 선택해야했다.

두 방식의 차이점은 크게 보면 세션은 유저 정보가 서버에 저장되고, 토큰은 유저 정보를 클라이언트에서 보낸다는 점입니다. 우리는 토큰 전략을 선택했는데, 이는 다음과 같은 이유에서 였다.

 

 

구글, 네이버, 카카오 소셜로그인

OIDC란? OpenID Connect

OIDC는 OAuth 2.0 프로토콜의 상위 계층에서 인증을 담당하는 프로토콜입니다. Client가 User의 신원을 검증하도록 해줌과 한꺼번에 보편적인 유저 정보를 얻을 수 있게 해줍니다. OAuth프로토콜을 통하여 리소스에 접근하기 위해서는 먼저 인증이 선행되어야 하므로 OIDC가 OAuth의 상위 계층에 위치하게 되는 것입니다. 가장 중요한 특징은 표준이라는 것입니다. 카카오, 구글, 애플 등등 OIDC를 사용하는 어디든 같은 전략을 사용합니다.

즉, OIDC의 인증과정에서 사용되는 idToken만 있으면 어떤 것이든 로직으로 로그인 구현이 가능해진다. 이곳에서 idToken은 OIDC에서 사용되는 정보들을 담은 JWT입니다.

OIDC란? OpenID

idToken 발급

그럼 idToken을 받아와보자 이제 다음 과정으로 유효성을 검증해야합니다. 그 전에 유효성 검증 중 서명검증에서 사용할 RSAPublicKey를 생성해야합니다. 이 암호화된 키는 각 소셜로그인이 제공되는 공개키 목록을 조회한 후 목록들 중 하나를 선택하여 만든다. 단, 이곳에서 공개키는 kid가 발급받은 idToken의 헤더부분의 kid와 일치해야합니다. 이 공개키는 카카오 디벨로퍼에 있는 공개키 목록 조회하기 api를 사용합니다.

위의 공개키 목록 중 하나를 하나 까보자. 이 정보들로 RSA암호해독 키를 생성해야 합니다. 암호해독 키를 생성해 본적이 없어 이 과정에서 좀 헤맸다.

 



idToken 페이로드 서명 검증

유효성 검증를 진행하자. 과정은 카카오 디벨로퍼스에 상세하게 설명되어있습니다. 카카오는 최고다. 첫번째 이곳에서 보면 페이로드를 디코딩한 후 iss, aud, exp 값을 비교해야합니다. jwt Provider로 claim을 가져오는 과정에서 exp는 자동으로 검증이 되니 iss, aud를 확인해주면 됩니다. 또 use 정보 처럼 jwt에선 signature에 키를 넣어 서명 검증이 가능합니다. 이렇게되면 한번에 signature를 세팅해서 확인해주면 사실 2 7번의 과정이 한번에 진행되게 됩니다.

코드로 확인해보자. 이렇게 가져온 유저정보로 로그인을 수행합니다. OIDC로 인증을 걸친후 idToken에 담긴 유저정보로 우리 서버의 회원을 찾아서 사용하면 됩니다.

소셜 로그인 순서

내가 이해한 순서를 이해하기 쉽게 그림으로 만들어 보았습니다. 디자인 감각 Zero 1. 페이지 요청 사용자가 소셜 로그인 페이지에 접속합니다. 2. 페이지 응답 소셜 로그인 HTML 페이지를 웹앱 브라우저에 반환합니다. 3. 구글 로그인 요청 사용자가 구글 로그인 버튼을 클릭하면 httplocalhost3456userlogingoogle 주소로 GET 요청을 보낸다. 4. 구글 웹앱 브라우저 구글 로그인 페이지에서 사용자가 인증을 하면, 구글은 시크릿코드를 반환합니다.

5. controller 구글 시크릿코드를 사용해 구글에 accesstoken과 refreshtoken을 요청합니다. 6. 구글 controller 구글은 JWT와 user profile을 반환합니다.

JwtTokenProvider.java

secretkey는 application.yml파일에서 가져오고, 만약 없습니다.면 secretKey로 지정됩니다. PostConstruct어노테이션은 이 provider객체가 빈으로 주입되어 사용되기 시작할 때 실행되도록 메서드를 설정합니다. init메서드가 실행되면 secretkey를 base64형식으로 인코딩해서 변환합니다. setSubject를 사용해 sub속성을 로그인 요청할 때 입력한 아이디 username으로 등록합니다.

sub속성은 이 토큰의 제목subject를 나타낸다. 추가로 roles를 덧붙이는 것은 이 유저의 권한이 어디인지 나타낸다. http 메시지가 오면 그 메시지의 헤더를 참조해 토큰을 추출하는 resolveToken메서드와, 토큰이 정말 유효한지 서버의 비밀키와 만료기간을 통하여 심사숙고하는 validateToken메서드입니다.

자주 묻는 질문

OIDC란 OpenID

OIDC는 OAuth 2 좀 더 자세한 사항은 본문을 참고해 주세요.

idToken 발급

그럼 idToken을 받아와보자 이제 다음 과정으로 유효성을 검증해야합니다 좀 더 자세한 사항은 본문을 참고하시기 바랍니다.

idToken 발급

유효성 검증를 진행하자 자세한 내용은 본문을 참고 해주시기 바랍니다.

댓글

💲 추천 글