Spring-Boot

OAuth란?

뚜코맨 2023. 7. 27. 17:48

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

흔히 볼 수 있는 네이버로 로그인하기, 구글로 로그인하기 같은 방법이다.

 

OAuth를 사용하면 인증 서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아 사용할수 있다. 리소스 오너 정보를 취득할 수 있는 방법은 4가지가 있다.

 

종류(type) 설명(description)
권한 부여 코드 승인 타입(Authorization Code Grant) OAuth 2.0에서 가장 잘 알려진 인증밥법. 클라리언트가 리소스에 접근하는 데 사용하며, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급받는 방식
암시적 승인 타입(Implicit Grant) 서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방법. 클라리언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 권한 코드 교환 등의 별다른 인증과정을 거치지않고 액세스 토큰을 제공받는 방식
리소스 소유자 암호 자격증명 승인 타입(Resource owner password credentials) 클라이언트의 패스워드를 이용해서 액세스 토큰에 대한 사용자의 자격 증명을 교환하는 방식
클라이언트 자격증명 승인 타입(Client Credentials Grant) 클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식

앞으로 권한 부여 코드 승인 타입을 중심으로 설명하겠다.

권한 부여 코드 승인 타입이란?

애플리케이션, 리소스 오너(사용자), 리소스 서버, 인증 서버가 어떤 순서로 인증을 하는지 알아야한다.

권한 요청이란?

권한요청은 클라이언트, 즉, 스프링 부트 서버가 특정 사용자 데이터에 접근하기 위해 권한 서버, 즉, 카카오나 구글 권한 서버에 요청을 보내는 것이다. 요청 URI는 권한 서버마다 다르지만 보통은 클라이언트ID, 리다이렉트URI, 응답 타입 등을 파라미터로 보낸다. 실제 요청에 쓰이는 요청 URI을 통해 주요 파라미터를 알아보자

GET spring-auth-server.example/auth?
    &client_id=s6BhdRkqt3&state=xyz
    &redirect_uri=http://localhost:8080/myAuth&
    &response_type=code&
    &scope=profile

client_id

인증 서버가 클라이언트에 할당한 고유 식별자.

이 값은 클라이언트 애플리케이션을 OAuth 서비스에 등록할 때 서비스에서 생성하는 값.

 

redirect_uri

로그인 성공 시 이동해야 하는 URI.

 

response_type

클라이언트가 제공받길 원하는 응답 타입.

인증 코드를 받을 때는 code값을 포함해야 한다.

 

scope

제공받고자 하는 리소스 오너의 정보 목록

데이터 접근용 권한 부여

인증서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 변경하고 사용자의 데이터에 접근 동의를 얻는다.

이 과정은 최초 1회만 진행된다. 이후에는 인증 서버에서 동의 내용을 저장하고 있기 때문에 로그인만 진행한다.

로그인이 성공되면 권한 부여 서버는 데이터에 접근할 수 있게 인증 및 권한 부여를 수신한다.

인증 코드 제공

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

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

인증 코드 예
GET http://localhost:8080/myApp?code=a2spd2fmvw2k3

액세스 토큰 응답이란?

인증 코드를 받으면 액세스 토큰으로 교환해야한다. 액세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드를 의미한다. 보통 다음과 같이 /token POST 요청을 보낸다.

/token POST 요청 예
POST spring-auth-server.example.com/token
{
  "client-id": "66aw1sc54d",
  "client-secret": "aaaa11bbbcc33",
  "redirect_uri": "http://localhost:8080/myApp",
  "grant_type": "authorization_code",
  "code": "1q2w3e4r"
 }

client_secret

OAuth 서비스에 등록할 때 제공받는 비밀키

 

grant_type

권한 유형을 확인하는데 사용. 이때는 authorization_code로 설정해야함.

권한 서버는 요청 값을 기반으로 유효한 정보인지 확인하고, 유효한 정보라면 액세스 토큰을 응답한다.

액세스 토큰 응답 값의 예
{
  "access_token": "aabbccdd",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "openid profile",
  ... 생략 ...
 }

 

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

이때 제공받는 액세스 토큰으로 리소스 오너의 정보를 가져올 수 있다.

정보가 필요할 때 마다 API 호출을 통해 정보를 가져오고 리소스 서버는 토큰이 유효한지 검사한 뒤 응답

GET spring-auth-resource-server.example.com/userinfo
Header: Authorization: Bearer aabbccdd

'Spring-Boot' 카테고리의 다른 글

[Spring-Boot] 테스트케이스의 @Transactional  (0) 2024.01.12
메이븐(maven) vs 그래들(gradle) 비교  (1) 2023.12.20
ORM이란?  (1) 2023.10.25
스프링 시큐리티(Spring Security)  (0) 2023.07.15
스프링 부트란?  (1) 2023.07.08