[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 2 - User Entity 연동

웹 서비스를 개발하게 된다면, 기본적으로 갖춰져야 할 것은 바로 사용자 인증일 것입니다. 우리 서비스에 가입한 사용자인지를 구분해야 한다는 점과 더불어, 단골인지, 아닌지 등이나 사이트를 관리하는 관리자 등을 구분하는 데 있어, 사용자 인증은 필수적인 요소라고 할 수 있습니다.

 

그러나 서비스에 있어 가장 번거로운 것은 사용자 등록을 위한 회원 가입일 것입니다. 왜냐하면 사용자가 서비스를 이용하기 위해 자신의 개인 정보를 입력해야 하고, 본인 인증 절차를 거쳐야 하며, 주소와 전화번호 등을 입력함과 더불어, 또 다른 서비스를 이용할 때마다 ID와 비밀번호를 개별적으로 생성하고 관리해야 하기 때문입니다.

 

이번 포스트에서는 OAuth2 인증을 통해 접속한 사용자들을 저장하는 User Entity를 생성하고, 이를 구현하는 시간을 가져보도록 하겠습니다.

 

 

 

 

Create User Entity

지난 포스트에서 작업했던 내용을 이어서 User Entity를 만들어보도록 하겠습니다.

 

기본적으로 갖춰져야 할 Primary Key와 아이디, 패스워드 그리고 E-mail 주소 칼럼을 넣어줍니다. principal은 Spring Security에서 관리하게 될 권한들을 넣어 놓을 칼럼입니다. 

 

여기에 Lombok에서 지원하는 Builder 어노테이션을 이용하여 Builder 패턴을 이용하여 객체를 생성하도록 추가해줍시다.

 

Spring Data JPA에서 제공하는 JpaRepository를 상속 받고, E-mail을 이용하여 User 정보를 조회할 수 있도록 findByEmail 메소드를 정의합니다.

 

다양한 소셜 로그인 계정을 지원하기 위해 각 소셜 타입을 정의하는 방식으로 열거체를 사용하였습니다.

 

 

 

 

Argument Resolver

만약 로그인 했을 때 계정이 소셜 로그인된 계정이라면, 기존의 계정과 매핑해주거나, 그렇지 않으면 새로운 사용자로 생성해야 합니다. 일반적인 회원 가입은 Form을 이용해서 각종 정보를 받고, JPA를 이용해 정보를 넣고 DB에 넣으면 됩니다.

 

그런데, 소셜로 로그인된 계정은 어떻게 정보를 가져올 수 있을까요? 내가 만든 View에서 Form이 입력되는 것도 아니고, 그렇다면 소셜 계정 서버로부터 정보를 받아와야 하는데, 이미 Google 계정과의 연동은 Spring Security에서 만들어진 것을 사용했으니 이것을 재구현해야 하는 걸까요?

 

이럴 때는 Java의 어노테이션과 함께 Spring에서 제공하는 Argument Resolver를 이용해 볼 수 있습니다. oAuth2Login 메소드 밑으로 defaultSuccessfulUrl을 지정하여 소셜 사이트로부터 로그인이 성공하였을 때, API를 한 개 생성하고, 해당 메소드의 파라미터를 특정 어노테이션의 파라미터 타입으로 설정해주면, 해당 Resolver가 호출되게끔 할 수 있습니다. 이외에도 인터셉터를 사용하는 방법도 가능합니다.

 

먼저 기존에 우리가 설정했던 SecurityConfig 파일을 조금 고쳐보도록 하겠습니다.

 

이전에 작성했던 OAuth2Login에서 로그인 성공했을 때 포인트와 실패했을 때 포인트를 잡았습니다. 여기에 추가로 로그아웃 부분까지 설정하면 좋겠죠.

 

지난 포스트에서 작성했던 것 그대로 Argument Resolver를 생성해보도록 하겠습니다. 혹시라도 포스트를 보지 못했다면 아래의 링크를 꼭 참고해서 보고 진행해주세요.

 

https://blog.neonkid.xyz/238

 

[Spring] Argument Resolver를 이용한 유연성 있는 파라미터 처리

서비스를 운영하다보면 다양한 종류의 데이터를 받게 됩니다. 그럴 때마다 Controller 부분에서 이를 전처리하게 되는데, 이렇게 되면 각 Controller에 전처리 해야 하는 코드를 함수화 하거나 Utils 클

blog.neonkid.xyz

먼저 어노테이션부터 만들어보도록 하겠습니다.

 

적당한 이름을 주고, Target을 파라미터로 하여금 어노테이션을 한 개 만들어줍니다.

 

위에서 만든 Repository를 의존성 주입하여 사용하도록 합니다. 코드를 보면 대충 아시겠지만 간단하게 설명을 드린다면, 먼저 소셜 유저로 로그인 한 뒤, 세션에서 유저 정보를 가지고 옵니다. 기존 사용자가 해당 이메일 주소를 가지고 가입을 했다면 해당 유저와 소셜 로그인 할 수 있도록 연동되어 지고, 그렇지 않다면 새로이 사용자를 만드는 방향으로 구현하였습니다.

 

마지막으로 Controller에 아까 위에서 연동한 로그인 성공 엔드포인트시 실행할 메소드를 구현하고 해당 파라미터를 위에서 만든 어노테이션을 붙여서 연동해줍니다.

 

그리고, 만든 Argument Resolver를 리스트에 추가해주면 끝입니다. 이 부분은 지난 포스트에서 설명을 했기 때문에 생략하도록 합니다.

 

 

 

 

Test

테스트를 위해 애플리케이션의 설정을 아래와 같이 변경하여 H2 Database를 이용하여 사용자 데이터가 잘 삽입이 되어지는지를 보도록 합니다.

 

home 디렉터리 밑으로 test 파일을 만들고, 서버가 실행될 때마다 생성되도록 합니다.

 

console 페이지에 접근합니다. 우리는 아무런 사용자 이름과 패스워드도 설정하지 않았으므로 바로 Connect를 눌러 접속합니다.

 

보다시피 User 테이블이 만들어졌고, 조회를 하게 되면 아무런 데이터가 없음을 알 수 있습니다.

 

메인 페이지에 접속하여 로그인을 시도한 후 콘솔 페이지로 이동합니다.

 

그러면 위와 같이 새로운 계정이 생성이 되었음을 알 수 있습니다.

 

 

 

마치며...

뭔가 스프링 글을 계속 작성하면서부터 개념에 대한 글 보다는 기능 구현을 중심으로 글을 쓰게 될 경우, 전달이 잘 안되는 느낌을 받는 것 같다는 생각이 자주 들게 됩니다.

 

아무래도 뷰의 중심이 아닌 기술에 대한 이해도와 정의를 전달하는 데 그 의의를 두고자 하는 것을 목표로 해서 그런건지 다음 번 글을 쓸 때는 좀 더 전달력이 향상된 모습으로 글을 써보도록 하겠습니다.

 

OAuth2 로그인은 최근 웹에서 자주 사용되는 로그인 모델입니다. 사용자의 편의를 위해서도 제공되는 기능이니 웹 개발하시는 분들에게 있어 도움이 되었으면 좋겠습니다.

 

comments powered by Disqus

Tistory Comments 0