티스토리 뷰
OAuth
- 제3의 서비스에 계정 관리를 맡기는 방식
- OAuth를 사용하면 인증 서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아서 사용할 수 있다.
[관련 용어]
리소스 오너(resource owner)
: 자신의 정보를 사용하도록 인증 서버에 허가하는 주체. 서비스를 이용하는 사용자가 리소스 오너에 해당
리소스 서버(resource server)
: 리소스 오너의 정보를 가지며, 리소스 오너의 정보를 보호하는 주체를 의미
ex. 네이버, 구글, 페이스북
인증 서버(authorization server)
: 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션을 의미
클라이언트 애플리케이션(client application)
: 인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체를 의미.
ex. 지금 만들고 있는 서비스.
[리소스 오너 정보를 취득하는 4가지 방법]
권한 부여 코드 승인 타입(authorization code grant type)
- OAuth 2.0에서 가장 잘 알려진 인증 방법.
: 클라이언트가 리소스에 접근하는 데 사용하며, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급받는 방식.
임시적 승인 타입(implicit grant type)
- 서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방법.
: 클라이언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 권한 코드 교환 등의 별다른 인증 과정을 거치지 않고 액세스 토큰을 제공받는 방식
리소스 소유자 암호 자격증명 승인 타입(resource owner password credentials)
: 클라이언트의 패스워드를 이용해서 액세스 토큰에 대한 사용자의 자격 증명을 교환하는 방식
클라이언트 자격증명 승인 타입(client credentials grant)
: 클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식
여기서는 권한 부여 승인 타입으로 구현
권한 부여 승인 타입이란?
➊ 권한 요청
- 권한 요청은 클라이언트, 즉, 스프링 부트 서버가 특정 사용자 데이터에 접근하기 위해 권한 서버
즉, 카카오나 구글 권한 서버에 요청을 보내는 것이다.
- 요청 URI는 권한 서버마다 다르지만 보통은 클라이언트 ID, 리다이렉트 URI, 응답 타입 등을 파라미터로 보낸다.
아래는 실제 예시이다.

# client_id
- 인증 서버가 클라이언트에 할당한 고유 식별자
- 이 값은 클라이언트 애플리케이션을 OAuth 서비스에 등록할 때 서비스에서 생성하는 값.
# redirect_uri
- 로그인 성공 시 이동해야 하는 URI
# response_type
- 클라이언트가 원하는 응답 타입.
- 인증 코드를 받을 때는 code 값을 포함해야 한다.
# scope
- 제공받고자 하는 리소스 오너의 정보 목록
➋ 데이터 접근용 권한 부여
- 인증 서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 변경하고 사용자 데이터에 접근 동의를 얻는다.(최초 1회만 진행)
- 이후에는 인증 서버에서 동의 내용 저장 중이므로 로그인만 진행함.
- 로그인을 성공하면 권한 부여 서버는 데이터에 접근할 수 있게 인증 및 권한 부여를 수신한다.
➌ 인증 코드 발급(제공)
- 사용자가 로그인에 성공하면 권한 요청 시에 파라미터로 보낸 redirent_uri로 리다이렉션 된다.
- 이 때 파라미터에 인증 코드를 함께 제공한다.
인증 코드 예시
➍ 액세스 토큰 응답
- 인증 코드를 받으면 액세스 토큰으로 교환해야 한다.
- 액세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드를 의미
/token POST 요청 예시
# client_secret
- OAuth 서비스에 등록할 때 제공받는 비밀키.
# grant_type
- 권한 유형을 확인하는 데 사용한다.
- 이 때는 authorization_code 로 설정해야 한다.
- 권한 서버는 요청 값을 기반으로 유효한 정보인지 확인하고, 유효한 정보라면 액세스 토큰을 응답한다.
액세스 토큰 응답 값 예시
➎ 액세스 토큰으로 API 응답 & 반환
- 이런 상황에서는 제공받은 토큰으로 리소스 오너의 정보를 가져올 수 있다.
- 정보 필요할 때마다 API 호출을 통해 정보를 가져오고, 리소스 서버는 토큰이 유효한지 검사한 뒤에 응답한다.
리소스 오너 정보 가져오기 위한 요청 예시
쿠키
- 사용자가 어떠한 웹 사이트를 방문했을 때 웹사이트가 사용하는 서버에서 로컬 환경에 저장하는 작은 데이터
- 이 값이 있기 때문에 이전에 방문한 적이 있는지 알 수 있고,이전에 로그인을 했다면 로그인 정보도 유지할 수 있는 것
- 키와 값으로 이루어져 있으며 만료 기간, 도메인 등의 정보를 가지고 있다.
- HTTP 요청을 통해 쿠키의 특정 키에 값을 추가할 수 있습니다.
[그림] - 쿠키 추가 과정
그림을 보면
- 클라이언트가 정보를 요청하면 서버에서 정보를 값으로 넣은 쿠키를 생성해서 요청한 정보, 즉, HTTP 헤더와 함께 돌려보낸다.
- 그러면 클라이언트는 로컬(브라우저)에 쿠키를 저장한다.
- 이후 사이트에 재방문할 때는 사용자가 로컬 환경에 있는 쿠키와 함께 서버에 요청한다.
- 이렇게 하면 클라이언트에 값을 저장할수 있기 때문에 현재 사용자에 관련된 정보를 보여줄 수 있다.
'[개발] - Spring > [개발예제] OAuth' 카테고리의 다른 글
글에 글쓴이 추가하고, OAuth 뷰 구현, 테스트 코드 (0) | 2023.10.22 |
---|