[Oauth] 이해하기

수깡·2024년 3월 8일

Spring Security

목록 보기
8/11

🌟 OAuth 란?

제3의 서비스에 계정 관리를 맡기는 방식

  • 리소스 오너: 자신의 정보를 사용하도록 인증 서버에 허가하는 주체. 사용자가 이에 해당
  • 리소스 서버: 리소스 오너의 정보를 가지고, 보호하는 주체. 네이버, 구글, 카카오 등
  • 인증 서버: 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션
  • 클라이언트 어플리케이션: 인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체. (지금 개발하는 서비스)

인증 서버에서 발급받은 토큰을 이용하여 리소스 서버에 리소스 오너의 정보를 요청하고, 인증서버에게 인증을 받고, 응답받아 사용할 수 있다.

🌟 리소스 오너 정보를 취득하는 4가지 방법

  • 권한 부여 코드 승인 타입(authorization code grant type): 가장 잘 알려진 인증밥법으로, 클라이언트가 리소스에 접근하는데 사용한다. 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급받는다.
  • 임시적 승인 타입(implicit grant type): 서버가 없는 js 웹 애플리케이션에서 사용한다. 클라이언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 권한 코드 교환 등 별다른 인증 과정을 거치지 않고 액세스 토큰을 발급받는다.
  • 리소스 소유자 암호 자격증명 승인 타입(resource owner password credentials): 클라이언트의 패스워드를 이용하여 액세스 토큰에 대한 사용자 자격 증명을 교환한다.
  • 클라이언트 자격증명 승인 타입(client credentials grant): 클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용.

🌟 권한 부여 코드 승인 타입 방식

1. 권한 요청

클라이언트(스프링부트 서버)가 사용자 데이터에 접근하기 위해 권한 서버(카카오,구글)에 요청을 보내는 것.

클라이언트 ID, 리다이렉트 URI, 응답 타입 등을 파라미터로 보내 요청한다.

실제 요청 예시)

GET spring-auhorization-server.example/authorize?
client_id=48a4893g
redirect_uri=http://localhost:8080/myapp&
response_type=code&
scope=profile
  • client_id: 인증 서버가 클라이언트에 할당한 고유 식별자. 클라이언트 애플리케이션을 OAuth 서비스에 등록할 때 서비스에서 생성하는 값이다.
  • redirect_uri: 로그인 시 이동해야 하는 URI
  • response_type: 클라이언트가 제공받길 원하는 응답 타입. 인증 코드를 받을 때는 code값을 포함해야한다.
  • scope: 제공받고자 하는 리소스 오너의 정보 목록

2. 데이터 접근용 권한 부여

인증 서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 변경하고 사용자 데이터에 접근 동의를 얻는다.(최초 1회). 이후에는 로그인만 진행한다. 로그인이 성공하면 권한 부여 서버는 데이터에 접근할 수 있게 인증 및 권한 부여를 수신한다.

3. 인증 코드 제공

사용자가 로그인에 성공하면 권한 요청시 파라미터로 보낸 redirect_uri로 리다이렉션한다.

이때 파라미터에 인증 코드를 함께 제공한다.

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

인증 코드를 받으면 액세스 토큰으로 교환해야 한다!

액세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드.

POST spring-auhorization-server.example/token {
"client_id" :"48a4893g"
"client_secret" : "shuefh",
"redirect_uri" : "http://localhost:8080/myapp"
"grant_type" : "authorization_code",
"code" : "siuefhufei1"
}
  • client_secret : Oauth 서비스에 등록할 때 제공받는 비밀 키
  • grant_type : 권한 유형을 확인하는데 사용하는데, 이때는 authorization_code로 설정해야 한다. 권한 서버는 요청 값을 기반으로 유효한 정보인지 확인하고, 유효한 정보라면 액세스 토큰으로 응답한다.
//토큰 응답 값
{
	"access_token": "siufeh",
	"token_type" : "Bearer",
	"expires_in" : 3600,
	"scope" : "openid profile"
}

4. 액세스 토큰으로 API 응답 & 반환

제공받은 엑세스 토큰으로 리소스 오너의 정보를 가져온다. 정보가 필요할 때마다 API호출을 통해 정보를 가져오고, 리소스 서버는 액세스 토큰이 유효한지 검사 후 응답한다.

//리소스 오너의 정보를 가져오기 위한 요청
GET spring-authorization-resource-server.example.com/userinfo
Header : Authorization: Bearer aasdffb

다음 시간에는 Spring ouath2 client를 이용해서 spring security + jwt + oauth 로그인을 해보자!!

0개의 댓글