Spring Social 적용하기
Spring Social Documentation (http://projects.spring.io/spring-social/) 을 보다가, Github에서 적당한 예제를 검색해봤는데.. Production Ready 수준의 샘플이 없는 것 같아서 간단하게 만들었습니다.
1) Facebook, Twitter, Github, LinkedIn, Kakao 로그인
2) 소셜로 가입했지만, 이메일 + 패스워드 추가 정보를 받을경우 소셜 계정 & 이메일+패스워드로 두가지 방법으로 로그인 가능.
3) Scale Out 한 서버 환경에서 세션 클러스터링까지 고려하면 좋을것 같습니다.
대략 구성해보니..
Spring Boot + Spring Social + Spring Security 에
예제 코드에 Tomcat Session Clustering은 오버스펙인 거 같아서 Embedded Redis & Spring Session으로 간단히 처리했습니다. (물론 SpringBoot로 최대한 간단하게 예제 프로젝트를 띄우는데 초점을 맞춘 것도 한몫했고요~~)
결국 Spring Boot + Social + Security + Session 조합이 되었습니다.
간단하게 그림으로 표현해보면
1) 사용자는 Email + Password 기반의 로그인 or 소셜 로그인을 할 수 있다!
2) 소셜 로그인의 경우
- 해당 SNS로 Redirect후 O-Auth 인증을 받고, 가입이 되어 있는 경우 로그인 완료
- 미가입시에는 signup 페이지를 거쳐서 회원가입을 한다.
* Facebook, Github의 & 경우 scope 파리미터로 email 정보를 return 받을 수 있지만, 개인정보의 이슈로 Twitter, Kakao, LinkedIn의 경우는 해당 소셜 계정에 연결된 email 정보를 주지않네요 ㅜㅠ
3) 이후 회원가입이 완료된 경우, 사용자는 소셜 계정 & Email+Password 두 가지 모두로 로그인할 수 있게 됩니다.
- 즉, 소셜 계정을 통해 (UserConnection) 테이블에서 email을 찾아내고, 찾아낸 email을 기반으로 email + password로 로그인한 것과 동일한 상태를 가지게 되는것이죠.
실제 서비스에 연동할 때에는..
1) 하나의 계정 (User)에 여러 개의 Social 계정을 연동할 수 있는 형태로 설계하거나
2) 소셜 계정 로그인 시에는 사용자를 귀찮게 하지 않고 UserConnection 정보만으로 세션 생성 후, 추가적으로 사용자가 이메일(없을 경우), 패스워드를 입력하도록 유도하는 것이 UX 차원에서 좋지 않을까 싶습니다~~
소스코드는 https://github.com/brant-hwang/spring-boot-social-example 에 공개되어 있고,
Spring-Social-Kakao는 Github에 검색했더니 3개의 리파지토리가 있었는데, 그중 bongki님의 소스를 활용했습니다. (https://github.com/bongki/spring-social-kakao)
Freemarker Layout을 심플하게 적용하고 싶어서 손권남님이 개발하신 https://github.com/kwon37xi/freemarker-template-inheritance 을 사용했습니다.