본문 바로가기
320x100
320x100

Google, Facebook, Github, Kakao, Naver 전부 다 보여주겠다!! 내가 삽질해가며 얻은 결과들...

22년 중반의 글이다. 옛날 19 20년 글보고 베끼지 않았으니 안심해주세욧!

 

일단 시큐리티는 기본적으로 붙어있고, 게이트웨이를 쓰거나 모놀리식이라면 WebSecurityConfig에서 요청마다 인증을 필요/미필요하게 할건지 설정하는건 알거라 생각하므로... 넘어간다

 

스프링 시큐리티란?

인증, 인가를 기반으로 한 스프링 하위 프레임워크이다

인증(Authentication)은 간단히 말하면 로그인

인가(Authorization)는 간단히 말하면 내가 유저인데 어드민 권한으로 다른 사람의 계정 정보를 보거나 유저를 삭제할 수 없듯, 권한을 의미한다

 

OAuth(Open Authorization)가 나오게 된 배경

third party application에게 사용자의 비밀번호를 노출하지 않으면서, 어떻게 로그인(인증)과 권한(인가)를 부여할지에 대한 니즈에서 나오게 된 프로토콜이다

프로토콜은 우리 이런거, 저런거, 저쩔티비, 우짤티비 쓰는 대신에 정해진거 하나로 통일하자!! 이거로 대화하자고 하는 규약이라고 생각하면 된다

이 규약 안에서도 어느정도 자율성은 있지만 대부분 지켜진다

 

 

소셜로그인을 구현하려면 이 라이브러리가 필요하다(스프링 시큐리티는 이미 있다고 가정)

spring-boot-starter-oauth2-client

* maven pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
    <version>2.6.6</version>
</dependency>

* gradle build.gradle

implementation 'org.springframework.boot:spring-boot-starter-oauth2-client:2.6.6'

 

먼저 기본적으로 소셜로그인을 구현하려면

각각 사이트의 개발자버전 사이트에서 client-id와 client-secret 키(Optional but Essential for Security)를 받아야 한다

추가로 scope, redirectUri, userNameAttributeName, attributes라는 개념이 있다

 

1. scope

동의를 체크하는 등 해서 데이터를 얻어오는 범위(스코프)이다.

- name, nickname, email ... etc

 

스코프를 명시하지 않으면 google, facebook은 OAuth2가 아닌 OpenId방식으로 처리한다

이 경우는 OidcService(OpenId Connect Service)에서 처리한다

 

OAuth(Open Authorization)은 권한 부여를 위한 것이다(인증을 마치고 어떤 요청에 권한이 있는지 체크)

OpenID Connet는 인증을 위한 것이다

 

그렇기때문에 OpenID방식을 선택하면 인증을 위한 JWT(Json Web Token)을 직접적으로 만들어준다

나중에 결과로 보여주겠다

 

2. redirectUri

기본적으로 소셜로그인 처리는 정해진 링크로 301 302(차이는 영구이동, SEO, Page Rank) 를 하고 성공이나 실패를 판단 후에 보내질 리다이렉트 경로가 있어야한다.

사실 성공/실패 핸들러에서 직접적인 Uri로 보내줄수도있지만, Handler가 없다면 디폴트 리다이렉트로 간다

추가로 리다이렉트 uri까지 맞아야 동작하는 소셜도 있기 때문에 개발자 사이트에서 명시해줄때 알맞게 입력해주자

 

3. userNameAttributeName

Primary key값을 의미한다. 특정 값 혹은 객체{ }를 의미한다

중복되지 않은 json데이터의 rootName을 알려준다

구글같은 경우는 sub, 네이버같은 경우는 id로 들어온다

그렇다면 sub: {...}, id: {...} 에 담긴 값들은 중복이 없는 값이란 말이다

사실 정확하게하면 그 안에 있는 id값이 PK인거같다

 

4. attributes

사실 클래스의 객체로 보면 Map<String, Object> attributes이다

각각 다른 인증마다 전달해주는 데이터들이 다르기때문에 Map에서 값을 유동적으로 채운다

비슷하게 HttpMethod 통신도 Map으로 값을 받아올 수 있다. 대신 값이 명확하지 않고 너무 확장성 있는 코드와 API명세에 어려움이 있기때문에 명확하게 Reqeust, Response DTO class로 쓸 뿐이다.

 

+ provider(platform)은 요청이 들어온 서드 파티 앱을 말하고

+ oauthId(socialId)는 그 서드 파티 앱의 PK를 말한다

 

보통 provider, oauthId 2개를 이용해서 DB에 저장하고 토큰을 만들게 된다

 

OAuth 1.0 과 2.0 버전에 대해서는 언급하지 않겠다.

한번 궁금하면 찾아보자!!

 

일단 여기서 구현하는건 OAuth2 프로토콜이다

 

다음시간에는 각각 플랫폼에서 개발자로서 앱을 만들고 client-id를 받아오는 것을 포스팅하겠다~!

댓글