이번 장에서는 스프링부트 시큐리티와 소셜미디어(구글,페이스북,카카오등)를 사용해 편리하게 인증하는 OAuth2 인증 방식을 알아 보고자 한다.
인증 방식
어떤 웹사이트에 로그인을 하고자할 때 아래 사진과 같이 구글로그인으로 인증, 카카오로그인으로 인증 등의 경우를 많이 봤을 것이다.
이런 OAuth2 방식을 통하여 해당 사이트의 회원가입 절차를 생략하고 편리하게 인증 받을 수 있다.
그러면 우리 서비스를 사용하려는 고객이 네이버 회원임을 어떻게 알 수 있을까? 가장 간단한 방법은 고객한테 직접 네이버 아이디와 비밀번호를 받아서 네이버에 로그인을 해보면 된다. 하지만 보안 차원에서 말도 안되는 방법이다.
이러한 문제를 해결 하기 위해 OAuth가 생겼다.
OAuth는 쉽게 말해서 다른 서비스의 회원 정보를 안전하게 사용하기 위한 방법이라고 생각하면 된다.
고객이 자신의 네이버 아이디/비밀번호를 우리 서비스에 알려주지 않아도, 네이버에 등록된 고객정보를 우리 서비스에서 안전하게 사용하기 위한 방법이다.
네이버에 있는 고객의 정보를 우리 서비스에서 받으려면 Access Token을 네이버에게 전해주면 된다.
위의 사진 처럼 엑세스 토큰을 이용해, 네이버에서 토큰을 검증하고, 유효한 토큰이라면 해당 고객의 정보를 우리 서비스로 넘겨준다.
네이버 로그인으로 인증하기 버튼을 누르면 페이지가 네이버 로그인 페이지로 이동하는 것을 볼 수 있을 것이다.
고객이 성공적으로 네이버에 로그인을 했다면 아래의 화면이 뜨고 개인정보 동의 버튼을 누르면 다시 원래의 우리 서비스 페이지로 돌아오는 것을 볼 수 있다.
이러한 과정을 기술적인 측면에서 보면 어떠한 일이 일어났을까?
네이버 로그인 페이지로 이동할때 query string을 이용하여 redirect_uri값을 URL에 묶어서 이동시킨다. 자세한 이유는 아래에서 설명하겠다.
2) 고객이 네이버 로그인을 성공했을 때.
네이버 서버에서는 아이디/비밀번호를 확인하고 해당 고객이 네이버 회원임을 정상적으로 확인하면 이 고객과 관련된 엑세스 토큰을 발급해준다.
3) 네이버 페이지 -> 우리 서비스 웹 페이지로 돌아왔을 때.
네이버에서 이 고객과 관련된 엑세스 토큰을 발급하고 우리는 이 토큰을 정상적으로 받은 상황이다.
어떻게 엑세스 토큰을 받아왔을까?
이 엑세스 토큰을 받는 과정에서 HTTP의 리다이렉트(Redirect)메세지를 이용한다.
리다이렉트 메세지는 서버에서 클라이언트보고 어디로 가라고 지정해주는 것이다. query string을 이용하여 발급 받은 토큰을 URL에 묶어서 우리 웹 사이트로 이동하게 되는 것이다.
그러면 반대로 네이버 입장에서 리다이렉트 되는 URL(우리 웹사이트의 URL)은 어떻게 알 수 있을까?
1)단계에서 redirect_uri를 보고 알 수 있는 것이다.
이러한 이유때문에, 위의 사진(네이버 로그인화면)의 URL을 자세히보면 redirect_uri값이 있음을 알 수 있다.
어떤 악의적인 사용자가 XSS공격이나 피싱 사이트를 이용해서 redirect_uri를 자기가 원하는 사이트로 바꾸면 어떻게 될까?
그럼 그 악의적인 사용자는 네이버로부터 엑세스 토큰을 받게될 것이고, 그 공격자는 엑세스 토큰으로 고객의 정보를 쉽게 알 수 있게된다.
이런 문제를 막기 위해서는, 사전에 OAuth를 사용하려면 우선 해당 서비스에 등록 절차를 밟아야한다.
이러한 과정에서 사전에 redirect_uri를 네이버와 합의를 보게 된다.
우리는 아까전에 네이버로 부터 받은 엑세스 토큰을 네이버에게 건네주면, 이 토큰을 확인하고 네이버가 관련된 고객정보를 넘겨줄 것이다.
권한 부여 코드 승인 타입(Authorization Code Grant Type)
클라이언트가 다른 사용자 대신 특정 리소스에 접근을 요청할 때 사용된다.
리소스 접근을 위한 사용자명과 비밀번호, 권한 서버에 요청해서 받은 권한 코드를 함께 활용하여 리소스에 대한 엑세스 토큰을 받으면 이를 인증에 이용하는 방식이다.
페이스북, 구글, 카카오 등의 소셜 미디어 들이 웹 서버 형태의 클라이언트를 이 방식으로 지원한다.
웹 서버에서 장기 엑세스 토큰(long-lived access token)을 사용하여 사용자 인증을 처리한다.
암시적 승인 타입(Implicit Grant Type)
권한 부여 코드 승인 타입과 다르게 권한 코드 교환 단계 없이 엑세스 토큰을 즉시 반환받아 이를 인증에 이용하는 방식이다.
리소스 소유자 암호 자격 증명 승인 타입(Resource Owner Password Credentials Grant Type)
클라이언트가 암호를 사용하여 엑세스 토큰에 대한 사용자의 자격 증명을 교환하는 방식
클라이언트 자격 증명 승인 타입(Client Credentials Grant Type)
클라이언트가 컨텍스트 외부에서 엑세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식
참고자료
https://velog.io/@undefcat/OAuth-2.0-%EA%B0%84%EB%8B%A8%EC%A0%95%EB%A6%AC,
처음 배우는 스프링부트 2