ETC

OAuth란?

hjkang

OAuth란?

  • 제 3의 서비스에 계정 관리를 맡기는 방식
  • 네이버로 로그인하기, 구글로 로그인하기, 페이스북으로 로그인하기...

 

 

용어

  • 리소스 오너(resource owner): 자신의 정보를 사용하도록 인증 서버에 허가하는 주체로, 서비스를 이용하는 사용자가 해당
  • 리소스 서버(resource server): 리소스 오너의 정보를 가지며 보호하는 주체를 의미. 네이버, 구글, 페이스북이 리소스 서버에 해당
  • 인증 서버(authorization server): 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할
  • 클라이언트 애플리케이션(client application): 인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체로, 지금 만들고 있는 서비스가 해당

 

 

권한 부여 코드 승인 타입

  • OAuth에서 가장 잘 알려진 인증 방법으로 구글, 카카오도 사용 중
  • 권한 요청은 클라이언트가 특정 사용자 데이터에 접근하기 위해 권한 서버에 요청을 보내는 것
  • 클라이언트 ID, 리다이렉트 URL, 응답 타입 등을 파라미터로 보냄

 

권한 요청 파라미터 예시

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

 

 

데이터 접근 권한 부여

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

 

 

인증 코드 제공

  • 사용자가 로그인에 성공 시 권한 요청 파라미터로 보낸 redirect_uri로 리다이렉션되는데, 이때 파라미터에 인증 코드 제공
GET http://localhost:8080/myapp?code=a23dfbsfd213
  • 인증 코드를 받으면 액세스 토큰(로그인 세션에 대한 보안 자격을 증명하는 식별 코드)으로 교환하여야 함
POST spring-authorization-server.example.com/token
{
  "client_id": .......,
  "client_secret": ......., // OAuth 서비스에 등록할 때 제공받는 비밀키
  "redirect_uri": "http://localhost:8080/myapp",
  "grant_type": "authorization_code", // 권한 유형 확인할 때 사용. 유효한 정보인지 확인하고 액세스 토큰으로 응답
  "code": .......
}

 

액세스 토큰 응답 예시

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

 

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

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

 

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

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

 

 


참고

- 스프링 부트3 백엔드 개발자 되기(자바 편)

'ETC' 카테고리의 다른 글

SEO(검색 엔진 최적화)란?  (2) 2023.11.08
HTTP 상태 코드  (0) 2023.11.04
VSCode - rest client  (0) 2023.08.31
모노레포(Monorepo)  (0) 2023.07.12
CSP, MSP 차이  (0) 2023.05.08