OAuth( Open Authorization ) :
。신용도있는업체(인증 서비스를 제공함으로써인증에 관한책임을 위임받아 대신 수행하는 기능
▶고객이인증 요청시백엔드는 해당인증 여부를Authorization Server에검증을 위임.
。인증에 관한책임은 모두백엔드 개발자는인증서비스를 사용하는클라이언트가 된다.
。사용자의자격증명을 특정어플리케이션 서버에 직접 제공하지 않아도,서버의자원(사용자 개인 정보)에 안전하게 접근 가능
▶ 사용자가 자신의계정정보를 노출하지 않고도 다른 서비스와 안전하게 연동
。타 인증 서비스에개인정보 취급을 위임함으로서어플리케이션 서버에서는인가작업및개인정보를 관리하지 않아도 되는 장점이 존재.
Resource Server에서사용자 정보는보수적으로최소한으로 가져오는게 좋다.
。개인정보(생일 / 연령대 / 출생연도 / 휴대전화등 )의 경우DB에 저장 중, 노출되는 경우 책임을 개발자가 지므로.
- 보통
OAuth2.0은로그인 인증만 수행하며,로그인 상태 유지는Session / JWT Token등을 선택해서 유지
。구글 인증서비스를 통해로그인만 수행하고,로그인해서개인정보만 받아오면구글에서 발급받은Access Token을 바로폐기
▶ 다른구글서비스를 사용할 필요가 없으므로,Access Token을refresh할 필요가 없다.
。이후로그인 상태유지는백엔드 서버에서 따로Access Token과Refresh Token을 구현해서로그인 상태를 유지
OAuth 2.0으로클라이언트에서로그인시클라이언트쪽에서로그아웃은 불가능.
。이미OAuth Provider에서 발급된Access Token에 의해로그인 상태가 유지되므로.
。localhost:8080/logout호출해도 안되는 이유는Spring Security에서로그아웃되는거지OAuth Provider에서로그아웃하는건 아니기 때문.
OAuth 로그인 서비스구현 시 주의사항
회원의사용자정보를 추가로 요청하기 위해서는사업자 등록또는추가 정보 입력 페이지를 추가 구현
。추가정보 입력페이지를 사용 시OAuth 로그인이 완료 시 표시되도록 설정
▶추가정보 입력 완료까지로그인 과정을 끝내지 않고,추가계속리디렉션을 수행
중복 회원을 방지하기 위해식별자를
。OAuth 2.0구현 시 보통이메일을식별용 아이디로서데이터의유일한 식별자역할을 수행
。동일한이메일이 존재하는 경우 다른Provider의이메일인지 확인하는로직을 작성
ex)naver의wjdtn747@naver.com이 등록된 상태에서wjdtn747@naver.com로 로그인 시 차단
。카카오는사업자로 등록되지 않으면이메일 계정을 요청할 수 없으므로서브ID로서ID + @kakao.com을 설정하여유일하게 식별하도록 설정@Column(unique = true, nullable = false) private String email; // private String provider;▶
Entity 설계시OAuth Provider 정보와 함께 다음처럼 설정
OAuth 2.0구성요소
Resource Owner:
。사용자로서자원(개인정보)의주인
▶API를 통해 보호된Resource를 소유한 주체.
ex)Google Drive의 파일을 소유하고 있는클라이언트
Client:
。Resource Owner대신API를 호출하는백엔드 어플리케이션
ex)Google Drive파일에 접근하고자 하는Spring Application
ex)
Authorization Server:
。클라이언트의인증을 담당 및인증된클라이언트에 대해Access Token을 발급하는서버
ex)Google OAuth Server
Resource Server:
。OAuth2.0 Authentication을 기반으로Authenticated된사용자에 대해서만 접근할 수 있도록 보호된API를 제공하는개인정보를 보관하는자원서버
▶자원을 저장하는 역할을 수행
。인증된Access Token을 포함한HTTP Request만 허용하는서버
▶Access Token을검증하여HTTP Request를 허용 또는 거부.
ex) 접근하려는Google Drive파일을 보관하는 Server( =Google Drive)
권한부여승인코드
。Client Application이Resource Owner에 대한정보를 획득하기 위해Resource Server로부터 모든자원( =개인정보) 중동의한 내용의개인정보에 접근할 수 있는권한을 포함하는Access Token을요청하는코드
권한부여승인코드를 활용한OAuth 2.0로그인 과정
。Spring Security는1번 ~ 8번까지YML 파일을 정의하여 자동으로 수행
▶8번 ~ 9번 구간에서백엔드 개발자가 요청한자원( =개인정보)을 활용해서요청 처리
1.사용자( =Resource Owner)에서백엔드 서버로인증 요청
2.백엔드 서버( =Client)에서구글인증서버로권한부여 승인코드 요청
。사용자 개인정보( =Resource)를 요구하는권한부여승인코드를 전송
。이후구글 인증 서버( =Authorization Server)는사용자에게로그인 페이지를 출력
3.사용자는구글 로그인 페이지를 통해인증을 수행
4.인증이 완료된 경우,구글 인증 서버에서백엔드 서버로권한부여승인코드를응답
5, 6.백엔드 서버는권한부여승인코드를 기반으로구글인증서버로Access Token을요청및응답
7, 8.백엔드 서버는구글 자원 서버로 해당Access Token에 정의된접근 권한에 해당하는자원(개인정보)을Access Token을요청에 포함하여 전송 및응답
。구글 인증 서버는 해당Access Token을 검증 후 이상이 없는 경우구글 자원 서버로접근을 허용
。백엔드 서버는 전달받은자원을 내부어플리케이션에서 활용
9.인증이 끝난 이후로그인 상태를 유지
。구글 인증서비스를 통해로그인만 수행하므로,로그인해서개인정보만 받아오면,구글에서 발급받은Access Token을 바로폐기
▶ 다른구글서비스를 사용할 필요가 없으므로,Access Token을refresh할 필요가 없다.
。이후로그인 상태유지는백엔드 서버에서 따로Access Token과Refresh Token을 구현해서로그인 상태를 유지
▶로그인은OAuth,로그인 상태 유지는우리의 백엔드 서버에서 수행