본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.




패스트캠퍼스의 '9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online' 강의 수강 47일차!
오늘은 Websocket을 활용한 실시간 메시징 도메인 서버의 OAuth2를 이용한 로그인 기능 고도화 작업을 진행하였다.
OAuth2
: 사용자의 아이디와 비밀번호를 공유하지 않고도 다른 서비스에서 제공하고 있는 정보에 사용자를 대신해서 접근할 수 있는 기능
OAuth2에서 정의하는 4개의 role
1. Resource Owner: 사용자
2. Client: 사용자의 인증을 통해 카카오톡 등의 서비스에 저장되어 있는 정보에 접근하고자 하는 어플리케이션 (현재의 경우, 채팅 서비스)
3. Authorization Server: 사용자의 인증을 받은 클라이언트에게 리소스 서버에 접근할 수 있는 access token을 발급해주는 서버
4. Resource Server: 사용자의 정보를 담고 있는 서버
이번 프로젝트에서는 Authorization Code Grant 방식을 사용하기로 했다.
1. Resource Owner가 클라이언트로 접근을 시도
2. Client는 Authorization 서버로 Resource Owner를 Redirect 시켜 인증을 하도록 함
3. Resource Owner가 Authorization 서버를 통해 로그인 -> Authorization 서버는 Authorization Code 발급해줌
4. Resource Owner가 위에서 발급받은 코드를 클라이언트에 전달 -> Authorization 서버로부터 리소스 서버에 접근할 수 있는 Access Token을 발급받음
5. 이후, 클라이언트는 필요 시 Access Token을 통해 리소스 서버로부터 리소스 오너(사용자)의 정보를 가져옴
스프링 시큐리티에서는 OAuth2 Client 라는 추가적인 모듈을 제공하고 있다.
이를 추가하면, 기본적으로 사용되던 form login 방식의 인증 흐름에 차이점이 생긴다.
UsernamePasswordAuthenticationFilter/Token, UserDetailsService, UserDetails가 사용되지 않고,
OAuth2 로그인을 위해 구현된 OAuth2LoginAuthenticationFilter, OAuth2AuthenticationProvider, OAuth2UserService, OAuth2User 인터페이스를 사용하여 인증이 진행된 후 Authentication 객체를 반환한다.
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
build.gradle 파일에 의존성을 추가해주었다.

카카오톡과 연동하기 위해, kakao developers에서 우리의 서비스를 등록해주었다.
security:
oauth2:
client:
registration:
kakao:
client-id: 앱 키 > REST API 키
client-secret: 카카오 로그인 > 보안 > Client Secret
scope:
- profile_nickname
redirect-uri: "http://localhost:8080/login/oauth2/code/kakao"
client-name: kakao
authorization-grant-type: authorization_code
client-authentication-method: client_secret_post
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
이후, application.yml 파일에 OAuth2 클라이언트를 사용하기 위한 설정값들을 추가해 주었다.


어플리케이션을 실행하면 위와 같이 카카오톡 로그인 화면이 뜨고, 로그인을 하면 개인정보 이용 동의창이 뜨는 것을 확인할 수 있다.
스프링에서 oauth 설정이 이렇게 간단한지 처음 알았다..!
카카오 이외의 다른 서비스로 OAuth 기능 구현도 해보고 싶은 생각이 든다.