OAuth2 개념 정리

Ogu·2023년 10월 1일
0
post-thumbnail

Oauth란?

Oauth는 제3의 서비스에 계정 관리를 맡기는 방식입니다.
흔히 볼 수 있는 Google, Kakao, Naver 등으로 로그인하는 방법입니다.

Oauth 구성 요소

구분설명
Resource Owner웹 서비스를 이용하려는 유저, 자원(개인정보)을 소유하는 자, 사용자
즉, 'Resource' 는 개인정보이다.
Client리소스 오너의 리소스를 사용하는 주체로, 자사 또는 개인이 만든 애플리케이션 서버
Authorization Server권한을 부여(인증에 사용할 아이템을 제공주는)해주는 서버다. 사용자는 이 서버로 ID, PW를 넘겨 Authorization Code를 발급 받을 수 있다. Client는 이 서버로 Authorization Code을 넘겨 Token을 받급 받을 수 있다.
Resource Server사용자의 개인정보를 가지고있는 애플리케이션 (Google, Facebook, Kakao 등) 회사 서버
Client는 Token을 이 서버로 넘겨 개인정보를 응답 받을 수 있다.
Access Token자원에 대한 접근 권한을 Resource Owner가 인가하였음을 나타내는 자격증명
Refresh TokenClient는 Authorization Server로 부터 access token(비교적 짧은 만료기간) 과 refresh token(비교적 긴 만료기간)을 함께 부여 받는다.

client는 Resource Owner(사용자)를 대신해 로그인 하는데, 이때 필요한 정보를 Resource Server(kakao, naver, ...)에서 얻어 서로 비교해 유효성을 판단합니다.
즉, client가 유저의 (로그인)정보/자원(resource)을 Resource Server에 요청해 대신 로그인 합니다.

이때, 클라이언트는 2가지 단계를 거칩니다.

  1. Resource Owner로 부터 동의(허용)
  2. Resource Server로 부터 client 신원확인

OAuth2 권한 부여 방식 4가지

OAuth를 사용하면 인증 서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아 사용할 수 있습니다. 어떻게 클라이언트는 리소스 오너의 정보를 취득할 수 있을까요?

권한 부여 코드 승인 타입 (authorization code grant type)

OAuth 2.0에서 가장 잘 알려진 인증 방법으로, 클라이언트가 리소스에 접근하는 데 사용하며, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급 받는 방식입니다.

암시적 승인 타입 (implicit grant type)

서버가 없는 자바 스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방식입니다.
클라이언트가 요청을 보내면 리소스 오너의 인증 과정 의외에는 권한 코드 교환 등의 별다른 인증 과정을 거치지 않고 액세스 토큰을 제공받는 방식입니다.

리소스 소유자 암호 자격증명 승인 타입(resource owner password credentials)

클라이언트의 패스워드를 이용해서 액세스 토큰에 대한 사용자의 자격 증명을 교환하는 방식입니다.

클라이언트 자격증명 승인 타입(client credentials grant)

클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식입니다.

우리는 구글, 카카오에서 사용하는 가장 잘 알려진 방법인 권한 부여 코드 승인 타입에 대해서 알아보고 실습해 보겠습니다.

권한 부여 코드 승인 타입

📢 권한 요청

클라이언트, 즉 스프링 부트 서버가 특정 사용자 데이터에 접근하기 위해 권한 서버, 즉 카카오나 구글 권한 서버에 요청을 보내는 것을 말합니다.
요청 URI는 보통 Client ID, 리다이렉트 URI, 응답 타입 등을 파라미터로 보냅니다.

ex) GET 요청 URI

GET spring-authorization-server.example/authorize?
	client_id=66a36b4c2&
    redirect_uri=http://localhost:8080/myapp&
    response_type=code&
    scope=profile

필수 파라미터

구분설명
cliend_id인증 서버가 클라이언트에 할당한 고유 식별자.
클라이언트 애플리케이션을 OAuth 서비스에 등록할 때 서비스에서 생성하는 값이다.
redirect_uri로그인 성공 시 이동해야 하는 URI
response_type클라이언트가 제공받길 원하는 응답 타입. 인증 코드를 받을 때는 code값을 포함해야 함.
scope제공받고자 하는 리소스 오너의 정보 목록

📢 데이터 접근용 권한 부여

인증 서버에 처음 요청을 보내는 경우, 사용자에게 보이는 페이지를 로그인 페이지로 변경하고 사용자의 데이터에 접근 동의를 얻습니다. 이 과정은 최초 1회만 진행되며, 이후에는 인증 서버에서 동의 내용을 저장하고 있기 때문에 로그인만 진행합니다. 로그인에 성공하면 권한 부여 서버는 데이터에 접근할 수 있게 인증 및 권한 부여를 수신합니다.

📢 인증 코드 제공

사용자가 로그인에 성공하면, 권한 요청 시에 파라미터로 보낸 redirect_uri로 리다이렉션됩니다.
이때 파라미터에 인증 코드를 함께 제공합니다.

GET http://localhost:8080/myapp?code=a1s2d3f4g5 

📢 액세스 토큰 응답이란?

권한 부여 코드 승인 타입에서는 인증 코드를 받으면 액세스 토큰으로 교환해야 합니다.
액세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드를 의미합니다.
보통 /token 에 POST 요청을 보냅니다.

ex) /token POST 요청

POST spring-authorization-server.example.com/token
{
	"client_id": "66a36b4c2",
    "client_secret": "aabb11dd44",
	"redirect_uri": "http://localhost:8080/myapp",
  	"grant_type": "authorization_code",
  	"code": "a1b2c3d4e5f6g7h8"
}
구분설명
cliend_secretOAuth 서비스에 등록할 때 제공받는 비밀키
grant_type권한 유형을 확인하는데 사용.
authorization_code로 설정하며, 권한 서버는 요청 값을 기반으로 유효한 정보인지 확인하고, 유효한 정보라면 액세스 토큰을 응답

위와 같이 /token POST 요청을 보내 해당 정보가 유효한 정보라면 아래와 같이 응답으로 액세스 토큰의 값을 받습니다.

ex) 액세스 토큰 응답 값

{
	"access_token": "aasdffb",
    "token_type": "Bearer",
	"expires_in": "3600",
  	"scope": "openid profile",
  	... 생략
}

📢 액세스 토큰 응답이란?

제공받은 액세스 토큰으로 리소스 오너의 정보를 가져옵니다. 정보를 요청할 때 마다, API 호출을 통해 정보를 가져오고 리소스 서버는 토큰의 유효성을 검증하고 응답합니다.

ex) 리소스 오너의 정보를 가져오기 위한 요청 예

GET spring-authorization-resource-server.example.com/userinfo
Header: Authorization: Bearer aasdffb

쿠키란?

쿠키란 사용자가 어떠한 웹사이트를 방문했을 때, 웹사이트가 사용하는 서버에서 로컬 환경에 저장하는 작은 데이터입니다.
이를 통해 이전의 방문 여부와 로그인 정보도 유지할 수 있습니다.
쿠키는 key와 value로 이루어져 있으며 만료기간, 도메인, 경로 등의 정보를 가지고 있습니다.
아래와 같이 HTTP 요청을 통해 쿠키의 특정 키에 값을 추가할 수 있습니다.

참고

profile
私はゲームと日本が好きなBackend Developer志望生のOguです🐤🐤

0개의 댓글