여러 사이트에 회원가입하게 되면 나의 개인정보가 여러곳에 노출된다.
수많은 사이트에 퍼져있는 것보단 한곳에서 나의 개인정보를 관리하는 것이 보안에 좋다고 생각함.
-대형 포털 사이트가 관리 (ex. 네이버, 카카오)
개인정보 노출을 막기 위해 여러 사이트를 관리하는 것보단 나의 개인정보를 큰 대형 포털사이트에만 입력하고 그곳에서 제대로 보안을 하게되면 개인정보 노출 우려가 줄어든다.
하지만 대형 포털 사이트 자체가 노출이 되면 모든 사이트가 노출된다는 단점이 존재한다.
→ 이후 빠르게 대형 포털 사이트의 로그인 정보만 수정하면 노출를 빨리 막을 수 있다는 장점도 존재함.
-OAuth 흐름
- 로그인페이지에서 일반 로그인이 아닌 OAuth 로그인 버튼을 선택
- 대형 포털 사이트 아이디로 로그인 요청 (대형 포털 api 서버)
- 정상적인 로그인이라면 redirect로 콜백을 해줌. 이 때 code를 반환함.
- 이 code 포함하여 다시 대형 포털 api 서버에 request 요청을 보내면
- 포털 api 서버는 자원 서버(DB서버)에 접근할 수 있는 AccessToken을 반환함.
- 이번엔 이 AccessToken을 포함하여 자원서버에 request 요청
- 자원 서버는 해당 유저의 개인정보를 반홤해줌
- spring 서버는 이 유저가 기존 회원이면 로그인 처리, 신규 회원이라면 회원가입 처리와 로그인 처리를 실행함.
스프링에선 이러한 OAuth를 공식적으로 지원해주는 사이트가 존재한다.
→ 공식적으로 지원해주는 OAuth 주체 - facebook, google
→ OAuth-Client 라이브러리 사용! → 로그인 인증과, 권한 처리 생략해줌
라이브러리를 이용하면 3,4,5,6 을 생략할 수 있다. code를 api서버에 요청하고 AccessToken을 받고 다시 자원서버에 요청하는 로직을 라이브러리가 대신 수행해준다.
-라이브러리 추가
SecurityConfig 클래스 → oauth 로그인을 사용하고 개인정보 응답을 oAuth2DetailsService로 받음.
OAuth2DetailsService → 리턴값이 OAuth2User
-PrincipalDetails 클래스
OAuth2User를 상속 받은 새로운 클래스를 생성할 수 있지만 시큐리티 세션에 로그인 방식에 따라 다른 클래스가 저장된다.
- 일반 로그인 시 → PrincipalDetails
- OAuth 로그인 시 → OAuth2User를 상속받은 새로운 클래스
두 가지의 경우의 수로 저장이 되기 때문에 controller 단에서 두개를 구분하는 로직이 추가적으로 필요!
→ 때문에 PrincipalDetails에 추가적으로 OAuth2User를 상속받아 공통으로 시큐리티 Authentication으로 사용!
기타 참고 자료
'백엔드 개발' 카테고리의 다른 글
도커 실행, 종료, 이미지 레이어 (0) | 2022.09.19 |
---|---|
Docker 란 (0) | 2022.09.16 |
SSE 프로토콜을 활용한 채팅서버 (0) | 2022.05.15 |
JWT 토큰 (0) | 2022.03.29 |
업로드 폴더 위치 (0) | 2022.03.24 |
댓글