📝 OAuth 2.0 카카오 로그인
- 이번 시간에는 카카오 로그인 기능을 구현해보도록 하겠습니다.
- 카카오 로그인 기능은 OAuth 2.0 프로토콜 기반의 사용자 인증 기능을 제공하고 있습니다.
- 여기서 OAuth 2.0이란 인증을 위한 개방형 표준 프로토콜로써, Third-Party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공합니다.
- OAuth 2.0에 대한 보다 자세한 설명은 아래 링크에서 확인하실 수 있습니다.
- 우선 이러한 카카오 로그인 기능을 활용하기 위해서는 Kakao Developers 사이트에서 환경설정을 해야하는데 해당 부분은 영상에 자세히 나와있으니 따로 설명하지 않겠습니다.
- 영상에 따라 환경설정을 완료하고 아래 작업까지 완료했다면 이제 환경설정 단계에서 설정한 콜백 경로를 실질적으로 구현해주어야 합니다.
- 따라서 우리는 UserController 클래스에 다음과 같이 함수를 구현해줄 수 있습니다.
- 이후 페이지를 실행시켜 카카오 로그인을 진행해보면 다음과 같은 결과가 나타나는 것을 확인할 수 있습니다.
- 위처럼 인가 코드만 받았다고 해서는 카카오 로그인이 완료되지 않습니다. 카카오 로그인을 완료하기 위해서는 토큰을 받아야 하는데, 그 방법은 다음과 같습니다.
- 우리는 위 규칙에 따라 카카오쪽으로 데이터를 요청해야하는데 그 방법은 다음과 같습니다.
- 위에서부터 차례대로 코드를 분석해보도록 하겠습니다.
- 먼저 RestTemplate이란 스프링 3.0부터 지원하는 http 통신을 위한 템플릿으로 Rest API 호출 이후 응답을 받을 때까지 기다리는 동기 방식의 템플릿입니다.
- 다음으로 HttpHeaders 객체를 통해 요청하는 데이터의 타입을 지정해주고 있으며
- 이어서 데이터 요청에 필요한 정보들을 하나의 객체에 담아 주었습니다. 여기서 들어간 정보들은 위에서 언급된 규칙들에 따라 설정한 것입니다.
- 이후 위에서 생성한 헤더(headers) 정보와 바디(params) 정보를 하나의 객체로 합쳐주었으며, 해당 객체를 통해 카카오쪽으로 요청을 보내고 반환된 객체를 저장해주었습니다.
- 반환된 객체를 페이지를 통해 출력시키고 그 결과를 Json Parser를 통해 확인해보면 다음과 같습니다.
- 즉, 우리는 access_token을 받아왔으며 해당 토큰을 통해서 카카오쪽 서버에 있는 회원 정보에 접근할 수 있는 권한을 얻게되었습니다.
📝 자동 로그인 및 회원가입
- 이번에는 위에서 받은 토큰 정보를 통해 사용자 프로필을 받아서 자동 로그인 및 회원가입하는 기능을 구현해보도록 하겠습니다.
- 우선 받아온 토큰 정보를 객체로 저장하기 위해 다음과 같이 토큰 클래스를 생성해줍니다.
- 위 클래스를 통해 토큰 정보를 객체로 저장합니다.
- 이어서 위 객체를 통해 사용자 프로필을 요청합니다.
- 마찬가지로 사용자 프로필 정보를 객체로 저장하기 위해 아래와 같은 클래스를 생성해줍니다.
- 이후 사용자 프로필을 객체로 저장합니다.
- 여기서 cosKey란 카카오 로그인을 통해 로그인한 회원들에게 공통적으로 부여되는 비밀번호로써 모두가 공유하는 비밀번호이기 때문에 해당 비밀번호는 절대 외부에 알려져서는 안되며 이러한 비밀번호는 아래와 같이 설정할 수 있습니다.
- 우선 application.yml 파일에 다음과 같이 코드를 추가해줍니다.
- 이후 UserController 클래스에 다음과 같은 필드를 추가해줍니다.
- 우리는 앞으로 카카오 로그인을 수행할 때 위의 비밀번호를 통해 자동 로그인을 수행할 것입니다. 따라서 해당 비밀번호는 사용자에 의해 변경될 수 없으므로 기존의 코드를 조금 수정해주어야 합니다.
- 먼저 User 클래스에 필드를 하나 더 추가해주었습니다.
- 위 필드는 해당 유저가 어떤 방식으로 로그인하였는지를 확인하기 위한 것으로 일반 로그인일 경우 null 값이, 카카오 로그인일 경우 "kakao"가 들어갈 것입니다.
- 이후 updateForm.jsp 파일을 다음과 같이 수정해줍니다.
- 즉, 위 코드의 의미는 해당 유저의 로그인 방식이 OAuth 방식이라면 비밀번호와 이메일을 변경할 수 없도록 각각을 숨기거나 readonly 속성을 사용하여 수정하지 못하도록 설정한 것입니다.
- 다음으로는 해당 회원이 기존 회원인지 아닌지를 판별하여 자동 회원가입 후 로그인을 수행하도록 구현해줄 것인데, 이를 위해 먼저 UserService 클래스에 회원을 찾아주는 새로운 함수를 구현해주었습니다.
- 위 함수는 파라미터로 username을 받아 해당되는 회원이 존재하는지 확인한 후, 존재한다면 해당 회원을 반환할 것이고 존재하지 않는다면 빈 회원 객체를 반환할 것입니다.
- 이후 UserController 클래스에서는 위 함수를 사용하여 회원인지 비회원인지를 판별한 뒤 그 결과에 따라 작업을 수행하도록 구현해줍니다.
- 추가로 반환 값을 통해 redirect 처리해주었으므로 해당 함수의 반환 타입에 붙어있던 @RequestBody 어노테이션을 삭제해주었습니다.
- 모든 작업이 완료되었다면 카카오 로그인을 수행하여 결과를 확인해봅니다.
💡 알게 된 점
- OAuth 2.0의 개념과 사용법
📌 Reference
'🚗 Backend Toy Project > 스프링 부트 게시판' 카테고리의 다른 글
[스프링부트 게시판] 22. 개선 및 수정사항 (0) | 2022.06.25 |
---|---|
[스프링부트 게시판] 21. 댓글 구현 (2) | 2022.05.17 |
[스프링부트 게시판] 19. 회원정보 수정 (0) | 2022.05.15 |
[스프링부트 게시판] 18. 게시글(추가, 상세보기, 삭제, 수정, 페이징) (0) | 2022.05.14 |
[스프링부트 게시판] 17. 비밀번호 해쉬 후 회원가입 및 로그인하기 (0) | 2022.05.12 |