[백업][가리사니] spring security oauth 통합 로그인 : 1. oauth 소개
java, spring

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

Spring Security OAuth 통합 로그인 시리즈

참고

플랫폼에 상관없이 OAuth2 를 통해 연동해본 경험이 있다면 바로 다음강의로 넘어가셔도 됩니다.

OpenID

2000년도 중반 OpenID 가 생겨나고 유행 하였습니다. 오픈 아이디를 이용하게 되면 오픈 아이디를 제공해주는 사이트에 가입하고, 해당 오픈 아이디를 지원해주는 모든 사이트에서 접속할 수 있기 때문에 회원정보를 간단하게 관리할 수 있습니다. 또한 사이트 가입에 대한 부담이나 장벽을 낮춤으로써 더 많은 회원을 유치 할 수 있습니다.

OAuth

하지만 오픈 아이디는 표준스펙이 존재하지 않았기 때문에 제공자마다 서로 다른 프로토콜을 제공하여 여러 오픈 아이디를 제공하기 위해선 각 규격별로 연동을 만들어야 했고, 일부 프로토콜에선 보안 이슈가 많이 나오기도 했습니다. 때문에 표준적인 방법을 고려하던 사람들은 OAuth 라는 규격을 만들고 2007년 10월 03일 OAuth 1.0 을 발표하게 되었습니다. https://oauth.net/ 2016년 OAuth 의 최신버전은 2.0이며 대부분의 소셜과 국내 대형 포털들은 해당 스펙에 맞게 로그인을 제공해 주고있습니다. OAuth2 를 제공하는 서비스 페이스북, 깃허브, 트위터, 네이버, 카카오등... (그밖에도 많이 있지만 필자도 찾아봐야지 압니다.... 일반적으로 로그인 API를 지원한다라고 말하면 OAuth2 지원이라고 봐도 무방합니다.)

작동구조

페이스북을 예로 들어서 설명해 보겠습니다. 페이스북에서 로그인 연동 앱 "가리사니" 를 만들었다고 가정합니다.

준비
  • Client ID : 앱이 가지고 있는 클라이언트 아이디 (사용자에게 노출됨)
  • Secret Key : 앱이 가지고 있는 비밀키 (서버 내부 동작임으로 사용자에게 노출되지않음)
  • Access Token 주소 : 엑세스 토큰을 발급해주는 주소입니다.
  • User Authorization 주소 : 로그인이 이뤄질 주소 웹이라면 다이얼로그(UI)가 구현되어 있는 주소로 보냄.
  • UserInfo 주소 : 유저 리소스에 접근하는 주소
  • 허용 리다이렉트 주소 : 엉뚱한 곳으로 리다이렉트 하여 보안적 취약점을 만드는 것을 방어하기위해 리- 다이렉트를 허용할 주소를 설정합니다. scope : 가져올 정보들 (전자우편, 생일등...) 인증과정
가리사니 서버
  1. 로그인 페이지에서 페이스북 버튼을 클릭합니다.
  2. User Authorization 주소에 클라이언트 아이디와 스코프(필요권한), 리다이렉트를 보냅니다.
페이스북 서버
  1. 웹이라면 일반적으로 다이얼로그(UI)가 있는 "페이스북"의 로그인 화면으로 이동합니다.
  2. 사용자는 스코프(필요권한)을 확인하고 아이디와 암호를 입력 후 접속합니다.
  3. 로그인이 완료되었다면 페이스북은 가리사니에게 임시코드를와 함께 리다이렉트 합니다.
가리사니 서버
  1. 클라이언트 아이디, 비밀키, 임시코드를 Access Token 주소에 요청합니다. (서버측 동작)
  2. 서버는 응답정보를 주며 엑세스 토큰도 발급됩니다.
  3. UserInfo 주소에 엑세스 토큰과 함께 요청한 필요권한(아이디, 전자우편, 생일등..)정보도 요청하여 가져옵니다.
    • 여기서 사용자가 필요권한 중 일부를 커스텀으로 설정하여 제거하였다면 해당정보는 가져올 수 없게 됩니다. (그렇다면 권한 부족에의한 로그인 실패처리를 합니다. / 다만 권한설정이 기억되어 사용자에게 다시 묻지 않을 수 있음으로 신중하게 처리해야합니다.)
  4. 가리사니 서버는 해당 정보를 토대로 로그인 과정을 통해 사용자에게 피드백을 합니다. 이런식으로 OAuth 로그인이 완료됩니다. (자세한건 다음장에서!! 적도록하겠습니다.)