728x90

OAuth 2.0 이란?

서비스에서 사용자 개인정보와 인증에 대한 책임을 지지 않고 신뢰할 만한 타사 플랫폼에 위임
  • 개인정보 관련 데이터를 직접 보관하는 것은 리스크가 크며 보안적으로 문제되지 않도록 안전하게 관리해야 하고 ID/PW 에 관련된 지속적인 해킹 공격 등 여러 가지 신경써야 할 부분이 많음
  • 신뢰할 수 있는 플랫폼(구글, 페이스북, 네이버, 카카오 등)에 개인정보, 인증 기능을 맡기면 서비스는 인증 기능에 대한 부담을 줄일 수 있음

 

OAuth2 동작 방식

OAuth2 코드 방식 출처 : 3. 동작 원리 (devyummi.com)

저 사진에서 숫자대로 설명하겠다.

 

1. 사용자가 네이버, 카카오, 구글, 깃허브 등 로그인을 요구한다. 

2. 사용자의 요청을 OAuth2AuthorizationRequestRedirectFilter 에 의해서 첫 번째로 잡혀지게 된다. 그럼 그 요청을

3. 등록된 외부 소셜 로그인 지원서비스(네이버,카카오,구글,깃허브 등)의 인증서버에 도착하게 된다. 여기서 인증서버는 우리는 주소를 갖고있다.

4. 해당 서비스 로그인 페이지를 사용자에게 응답해준다. 네이버,카카오 로그인 창이 뜨는 것이다. 그럼 우리는 거기서 네이버나 카카오 같이 똑같이 로그인을 진행하는 것이다.

5. 로그인이 성공적으로 되면 3번에서 인증서버가 우리의 주소를 갖고있다고 했으니깐, 우리의 주소로 다시 리다이렉트된다. 이때 리다이렉트가 된다면 성공했다는 말과 함께 특정한 코드를 같이 날려준다.

6. OAuth2LoginAuthenticationFilter에서 해당 요청을 받게 된다. 그럼 이 필터는 뒷단인

7. OAuth2LoginAuthenticationProvider 클래스로 코드와 특정 정보를 넘겨준다. 

8. 그럼 네이버, 카카오 같은 인증 서버로 엑세스 토큰을 발급 받기위해 코드와 특정정보를 보낸다.

9. 엑세스 토큰을 받으면 코드는 소멸된다. OAuth2LoginAuthenticationProvider는 받은 엑세스 토큰을 사용하여 유저 정보를 획득하기 위해 네이버, 카카오와 같은 리소스 서버로 엑세스 토큰을 보내준다.

10. 리소스 서버는 받은 엑세스 토큰을 검증한 뒤로 유저 정보를 다시 돌려준다.

11. OAuth2UserDetailsService 에서 OAuth2UserDetails 객체로 부터 로그인을 마무리하고 등록되게 된다.

 

 

각각의 필터가 동작하는 주소 -- 관습

  • 위의 1번 과정에서 로그인을 시도할 때를 보면
  • OAuth2AuthorizationRequestRedirectFilter의 주소가 "/oauth2/authorization/서비스명" 인데 이것을 그대로 따르는 것이 좋다.
/oauth2/authorization/서비스명

// ex 
/oauth2/authorization/naver
/oauth2/authorization/google

 

  • 위의 5번 과정에서 로그인을 하고 나서 코드를 같이 날려준다고 했는데, 이때의 주소가 "/login/oauth2/code/서비스명" 인데 이것을 그대로 따라주자.
  • OAuth2LoginAuthenticationFilter : 외부 인증 서버에 설정할 redirect_uri 이다.
/login/oauth2/code/서비스명

// ex
/login/oauth2/code/naver
/login/oauth2/code/google
  • 모든 필터에 저 주소들이 디폴트 값으로 지정되어 있기 때문에 이런 관습을 따르는 것이 좋다.
  • 커스톰해서 사용은 가능한데.. 그냥 관습을 따르자.

 

OAuth2 인증 및 동작을 위한 변수들

  • 스프링에서 OAuth2 설정을 하면 특정 변수들만 설정을 해도
  • OAuth2AuthorizationRequestRedirectFilter → OAuth2LoginAuthenticationFilter → OAuth2LoginAuthenticationProvider 까지의 과정을 추가 설정하지 않아도 자동으로 진행한다.
  • 즉 우리는 가장 마지막 단계인 UserDetailsService, UserDetails 만 구현하면 된다.
  • 따라서 사용자는 UserDetailsServiceUserDetails만 구현하면 된다.

 

  • 위의 로직들이 동작하기 위해서 변수 설정이 필요하다고 했는데  .yml 파일에 등록할 값들이다. 
  • registration 은 필수 등록 해야 하는 정보고 provider 는 대형 사이트일수록 고정적으로 제공하기 때문에 그냥 그대로 가져다 쓰면 된다.
spring:
  security:
    oauth2:
      client:
        registration: -- [외부 서비스에서 우리 서비스를 특정하기 위해 등록하는 정보 : 필수] --
          kakao: -- [카카오] --
            client-id: -- [서비스에서 발급 받은 아이디] --
            client-secret: -- [서비스에서 발급 받은 비밀번호] --
            scope: --[리소스 서버에서 가져올 데이터 범위 >> 이메일, 닉네임, 아이디, 성별 등등 선택 가능] --
              - account_email
              - profile_nickname
            authorization-grant-type: authorization_code -- [코드 방식을 사용하기로 했으니] --
            redirect-uri: http://localhost:8080/login/oauth2/code/kakao --[서비스에 등록한 우리쪽 로그인 설공 url] --
            client-name: Kakao -- [서비스명] --
            client-authentication-method: client_secret_post

          naver:
            client-id: 3a_Puh_atCEjQRdro0ry
            client-secret: FyiSA5KCZP
            redirect-uri: http://localhost:8080/login/oauth2/code/naver
            client-name: Naver
            authorization-grant-type: authorization_code
            scope:
              - name
              - email

        provider: -- [이 부분은 변경없이 그대로 가져올 것] --
          kakao: -- [카카오] --
            authorization-uri: https://kauth.kakao.com/oauth/authorize -- [ 서비스 로그인 창 주소] --
            token-uri: https://kauth.kakao.com/oauth/token -- [토큰 발급 서버 주소] --
            user-info-uri: https://kapi.kakao.com/v2/user/me -- [ 사용자 정보 획득 주소] --
            user-name-attribute: id -- [응답 데이터 변수] --
          naver:
            authorization_uri: https://nid.naver.com/oauth2.0/authorize
            token_uri: https://nid.naver.com/oauth2.0/token
            user-info-uri: https://openapi.naver.com/v1/nid/me
            user_name_attribute: response

 

728x90

+ Recent posts