OAuth 알아보기

·2023년 12월 3일
0

Spring Boot

목록 보기
17/21
post-thumbnail

🤔 OAuth란?

OAuth란 제3의 서비스에 계정 관리를 맡기는 방식이다. 흔히 볼 수 있는 소셜 로그인이 바로 이 기술이다.

OAuth 관련 용어

  • 리소스 오너 (resource owner)
    자신의 정보를 사용하도록 인증 서버에 허가하는 주체이다. 서비스를 이용하는 사용자가 리소스 오너에 해당한다.

  • 리소스 서버 (resource server)
    리소스 오너의 정보를 가지며, 리소스 오너의 정보를 보호하는 주체를 의미한다. 네이버, 구글, 카카오 등이 리소스 서버에 해당한다.

  • 인증 서버 (authorization server)
    클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션을 의미한다.

  • 클라이언트 애플리케이션 (client application)
    인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체를 의미한다. 지금 만들고 있는 블로그 소셜 로그인 서비스가 이에 해당한다.

리소스 오너 정보를 취급하는 방법

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

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

  3. 리소스 소유자 암호 자격증명 승인 타입
    클라이언트의 패스워드를 이용해서 액세스 토큰에 대한 사용자의 자격 증명을 교환하는 방식이다.

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

😉 권한 부여 코드 승인 타입 자세히 알기

권한 요청이란?

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

실제 요청에 쓰이는 요청 URI를 통해 주요 파라미터를 알아보자.

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

권한 부여 코드 승인 타입의 흐름

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

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

2. 인증 코드 제공

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

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

액세스 토큰 응답은 뭔데?

액세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드를 말한다. 보통 /token POST 요청을 보낸다.

POST spring-authorization-server.example.com/token
{
  "client_id": "66a36b4c2",
  "client_secret": "aabb11dd44", // OAuth 서비스에 등록할 때 제공받는 비밀 키
  "redirect_uri": "http://localhost:8080/myapp",
  "grant_type": "authorization_code", // 권한 유형을 확인하는 데 사용
  "code": "a1b2c3d4e5f6g7h8"
}

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

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

profile
풀스택 개발자 기록집 📁

0개의 댓글