티스토리 뷰

스프링 부트 REST API WEB 프로젝트

깃헙 링크

https://github.com/choiwoonsik/springboot_RestApi_App_Project/tree/main/restApiSpringBootApp

수행 목록

  1. 환경구성 및 helloworld 출력
  2. H2 DB 연동
  3. Swagger API 문서 연동
  4. REST API 설계
  5. RestControllerAdvice를 이용한 통합 예외 처리
  6. Entity - DTO 분리
  7. MessageSource를 이용해 예외 메시지 다국화
  8. JPA Aduting을 이용해 객체 생성시간/수정시간 적용
  9. 스프링 시큐리티 + Jwt를 이용해서 인증 및 권한 체크
  10. 스프링 시큐리티 AuthenticationEntryPoint, AccessDenied로 인증 및 인가 예외처리
  11. Jwt AccessToken + RefreshToken으로 보안성과 사용자 편의성 고도화하기
  12. JUnit Test (단위 테스트)
  13. JUnit Test (통합 테스트)
  14. OAuth 2.0 정리
  15. OAuth 2.0 카카오 로그인 part.1 Authorization code + Token 발급
  16. OAuth 2.0 카카오 로그인 part.2 토큰으로 회원 가입 / 로그인
  17. OAuth 2.0 카카오 로그인 테스트 검증
  18. 환경별 설정을 위해서profile 분리하기 

1. OAuth의 사용 이유

Q. 다양한 서비스에서 카카오 로그인, 구글 로그인, 네이버 로그인 등을 통해 가입할 수 있도록 하고 있다. 이러한 방법을 사용하는 이유는 무엇일까?

 

A. OAuth를 사용하므로서 자체 로그인 시스템을 만드느라 개발해야할 서비스 로직보다 로그인 구현에 더 할애해야하는 배보다 배꼽이 더 커지는 일이 생기지 않도록 하기 위해서이다.

직접 로그인 구현시 많들어야 할 항목들을 보면

  • 로그인 시 보안
  • 회원가입 시 이메일 / 휴대폰 번호 인증
  • 비밀번호 찾기
  • 비밀번호 변경
  • 회원 정보 변경

등 다양한 로그인 구현 시 필요한 목록들이 있다. 이러한 것들을 카카오 / 네이버 / 구글 로그인으로 하면 해당 서비스에 맡길 수 있으므로 개발자는 자신의 서비스 구현에 몰두할 수 있다.

 

Q. 그렇다면 어떻게 외부 서비스에서 카카오 유저인지 알 수 있을까?

A. 유저가 카카오로 로그인하는 ID / PW를 우리에게 전달해서 우리가 그걸로 카카오 로그인을 하면 된다. 그런데 이런 로직은 말이 안된다. 따라서 카카오에서 로그인을 하고 인증절차를 거쳐서 사용자 정보를 전달받도록 하면된다.

 

2. Authorization Code + AccessToken

카카오에서 회원 정보를 받아와야되는데 어떻게 받아올까?

  • JWT의 AccessToken을 카카오에 전달하면 카카오는 그에 맞는 회원의 정보를 돌려준다.

로직

클라이언트 카카오 로그인 -> 카카오
<- Authorization Code
Authorization Code ->
<- AccessToken
AccessToken ->
<- 사용자 정보

Q. Authorization Code는 카카오에 로그인할 때 발급받는데 어떻게 우리가 가질 수 있을까?

A. 유저가 봍붙으로 우리에게 전달해줄 수도 있겠지만 이는 너무 귀찮은 방법이고 Redirect를 사용해서 구현하면 된다.

 

OAuth 카카오 로그인 창을 들어가면 기본적으로 Redirect URL이 설정되어 있다. 따라서 로그인에 성공하면 해당 URL로 자동 리다이렉트 되고 우리는 URL에 쿼리에서 인가 코드를 가져오면 된다. 이 인가 코드를 통해 AccessToken을 얻고 해당 토큰으로 카카오에게서 사용자 정보를 요청할 수 있다.

카카오가 대신 로그인을 통해 회원을 검증해주고 Authorization code를 발급해서 redirectURI로 돌려주게 된다.

 

그런데 rediect_uri의 주소가 조작되거나 변조되어 있다면 어떻게 될까? 누군가 악의적인 소행으로 uri를 조작하면 나의 서비스로 전달되어야 할 인가 코드가 원치않게 공격자가 설정한 주소로 전달될 수 있다. 그러면 중간 탈취자가 나의 인가 코드를 가지고 액세서 토큰을 발급할 수 있게 된다.

따라서 OAuth를 사용하기 위해서는 카카오나 네이버에서 OAuth를 사용하기 위해 사전정보를 입력해야한다. 이때 redirect_url도 등록하게 된다. 이렇게 하면 누군가 리다이렉트 주소를 변경해도 이미 등록된 주소가 아니면 조작되었다고 판단하고 반환하지 않게 될 것이다.

3. 정리

  1. 사용자가 나의 서비스에서 [카카오 로그인]을 누르면 카카오 로그인 창이 뜨게된다.
  2. 카카오 로그인이 정상 수행되면 카카오가 [인가 코드](Authorization Code)를 미리 설정한 redirect_uri로 되돌려준다.
  3. 나의 서비스는 redirect_uri로 들어온 url에서 [인가 코드]를 얻어서 kakao server에 AccessToken을 요청한다.
  4. 카카오는 [인가 코드]를 확인하고 AccessToken을 돌려준다.
  5. 사용자가 AccessToken을 얻고 이걸로 나의 서비스에 가입한다.
  6. 나의 서비스는 AccessToken으로 카카오 서버에 사용자 정보를 요청하고 값을 가져올 수 있으면 JWT을 발급시켜준다.
  7. 사용자는 발급받은 JWT으로 나의 서비스의 API를 요청한다.

 

정리한 내용을 바탕으로 실제 Kakao OAuth 2.0을 적용해보자


Reference

반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday