오늘은 OAuth에 대해 적어보도록 하겠다.
해당 게시글에선 OAuth를 구현하기 위해서 Spring 의 RestTemplate 을 사용 하였다.
RestTemplate 에 대해선 다른 게시글에서 자세하게 알아보도록 하겠다.
OAuth
OAuth
사용자가 웹 사이트에 접근 할 때 해당 웹 사이트에 비밀번호와 같은 정보를 제공하지 않고 서드파티 애플리케이션(카카오, 구글 등) 의 연결을 통해 인증과 권한을 부여 받을 수 있는 프로토콜이다.
서드파티 애플리케이션
다른 조직 또는 개인에 의해 개발 및 운영되는 소프트웨어 애플리케이션을 뜻한다.
프로토콜
인터넷에서 컴퓨터와 컴퓨터 간에 데이터를 주고받을 때 사용되는 통신 규약을 의미한다.
즉 OAuth 는 웹 사이트를 사용할 때 아이디와 비밀번호와 같은 정보를 해당 웹 사이트에 제공하지 않고 카카오, 구글 등과 같은 이미 내 정보를 가지고 있는 조직에서 인증을 대신 하는 것이다.
사용자는 여러 웹 사이트에 정보를 입력하는 번거로움을 없애고 웹 사이트는 사용자의 민감 정보를 관리하는 부담을 줄일 수 있다.
앱(서비스) 등록
OAuth 를 사용하기 위해선 OAuth 를 제공하는 조직에 앱을 등록 하여야 한다 여기서 앱이란 내가 제작한 웹 사이트 를 의미한다.
해당 게시글에선 카카오에 앱을 등록 후 OAuth 를 구현하도록 하겠다.
앱을 등록하는 방법은 다음과 같다.
위의 링크는 OAuth 와 같은 카카오 에서 제공하는 서비스와 기능을 활용할 수 있는 곳이다.
로그인 후 내 애플리케이션 을 통해 이동 하면 위와 같은 애플리케이션 추가 를 할 수 있다.
성공 적으로 애플리케이션을 추가하면
위와 같은 키를 발급 받을 수 있다.
사용할 키는 REST API 키로 RESTful API 를 사용하여 웹 서비스나 애플리케이션을 상호 작용하는데 사용되는 보안 인증 정보 이다.
쉽게 말해 해당 키로 카카오가 제공하는 기능을 사용 할 수있다.
위의 이미지 처럼 OAuth 를 통해 제공 받을 사용자의 데이터를 지정할 수 있다.
위의 이미지는 중요한 작업으로 카카오 API와 상호 작용하는 데 필요하다. 예로는 인증 이 완료되면 해당 URL 로 인증 결과를 수신하고 인증 성공 시 액세스 토큰, 인증 코드 등을 반환한다.
OAuth 용어
다음으로 OAuth 서비스 흐름을 이해하는 데 도움이되는 역할과 OAuth 인증 방식에 대해 알아보자.
역할
인증 방식
OAuth 는 다양한 인증을 위한 승인 방식이 있지만 해당 게시글에선 일반적으로 사용되는 방식을 사용 한다.
JWT 와 Refesh Tocken 인증 방식은 OAuth 의 다양한 인증 방식 중 나중에 사용해 보면 좋을 것 같은 것들을 추가 해 보았다.
OAuth 서비스 흐름
이제 OAuth 가 어떤식으로 동작하는지 살펴보도록 하자.
전체적인 흐름을 간단히 살펴 보자면 사용자가 웹 사이트 대신 서드파티 애플리케이션에 인증을 하고 인증에 성공하면 받은 인가 코드를 웹 사이트가 대신 받으며 인가 코드를 이용해 사용자의 데이터를 사용할 수 있는 권한을 얻을 수 있는 토큰을 발급 받고 해당 토큰을 이용해 사용자의 데이터를 불러온다.
우선 사용자가 웹 사이트를 통해서 카카오 로그인을 수행한다.
이 과정에서 웹 사이트는 카카오에서 제공하는 로그인 URL을 통해 사용자가 정보를 입력하도록 한다.
위의 이미지는 사용자가 버튼을 클릭시 이동시킬 카카오 URL 과 앞서 생성 했던 해당 웹 사이트가 등록된 앱인지 판단하는 키 값, 사용자가 성공적으로 인증 성공시 인증 코드를 받은 URL, 반환 받을 데이터의 형식 을 쿼리스트링 방식으로 나타낸 것이다.
해당 URL을 통해 사용자가 아이디와 페스워드를 입력 후 성공적으로 인증을 완료 하면 카카오에서 인가 코드를 웹 사이트로 반환 한다.
여기까지의 동작이 인증을 완료한 것이고 웹 사이트는 받은 인가 코드를 클라이언트 키와 리다이렉트 URL, grant_type 정보와 함께 사용자의 정보를 사용할 수 있게 해주는 토큰을 발급 받기위해 카카오 에 다시 요청을 보낸다.
위의 방식은 RestTemplate 을 사용해 카카오 서버에 토큰을 요청하는 방식이다.
토큰을 발급 받을 URL 을 지정하고 해당 URL에 보낼 HTTP 요청에 앞서 말한 키 값, 인가 코드 등의 데이터를 추가하고 POST 방식으로 요청을 보낸다.
여기서 grant_type 는 카카오에게 웹 사이트가 어떤 유형의 인가를 요청 했는지 나타내는 역할 이다.
위의 요청이 성공적으로 완료되면 카카오에서 토큰을 받을 수 있다.
여기까지가 웹 사이트가 사용자의 정보를 카카오에서 받을 수 있는 권한을 얻게 된 것이다.
추가적으로 여기 까지의 과정을 역할 설명에서 봤던 Authorization Server 와 상화작용을 한것이다.
웹 사이트는 발급 받은 토큰을 이용해 카카오에 사용자의 정보를 요청하고 카카오서버는 해당 토큰이 정상적인지 확인 후 웹 사이트에 사용자의 정보를 보내주게 된다.
토큰을 보내는 방식은 사용자의 정보를 요청할 URL 을 지정하고 토큰을 "Bearer " 을 추가한 값으로 보내 준다.
성공적으로 요청이 완료되면 웹 사이트는 사용자의 정보를 받을 수 있고 해당 정보를 이용해 사용자에게 토큰을 부여하는 등의 방식으로 서비스를 이용할 수 있게 해준다.
중요한점은 인가코드, 토큰, 사용자 정보를 얻는 카카오 URL 과 필요한 정보, 데이터가 다르기 때문에 카카오에서 제공하는 API에 맞춰 요청을 해야 정상적인 결과를 얻을 수 있다.
마지막으로 카카오, 구글, 네이버 등 각각 OAuth 앱을 등록하는 것과 요청을 보내는것에 차이가 있으니 확인 후 구현하도록 하자.