BE전문가 프로젝트

6-0 OAuth에 대해서 본문

SpringBoot Security

6-0 OAuth에 대해서

원호보고서 2023. 7. 25. 11:03

OAuth란?

Open Authoriztion은 엑세스 위임을 위한 개방형 표준 인가 프로토콜이며 서버 소유자를 대신하여 클라이언테에 서버 리소스에 대한 보안 위임 액세스를 제공한다.

쉽게 말해 서버의 소유자를 대신하여 구글 및 네이버와 같이 사용자의 정보를 가지고 있는 플랫폼에서 보안 위임 액세스를 제공하는 것이다.

 

OAuth 2.0

이전 버전인 OAuth 1.0이 있었지만 이전 버전에 부족한 점을 보완하여 2.0으로 버전업 하였다. 현재는 2.1까지 나온상태

OAuth 1.0 OAuth 2.0
복잡한 암호화과정을 통해 암호화 진행 HTTPS를 통해 발급된 TOKEN만 사용하여 요청
Resource Server만 존재 Authorization Server와 Resource Server분리하여 명확한 서비스 제공
토큰 만료기간 설정 불가능 토큰 만료기간 설정 가능

 

OAuth의 주체

Resource owner

  • Resource Server에 저장되어있는 resource의 주인(사용자)

Client

  • oAuth2를 통해 사용하려는 웹 서비스(이용하려는 웹 서비스)

Authorization Server(권한 서버)

  • 권한을 관리해주는 서버를 의미하며 Token을 발급해주는 서버(payco 및 여러 인증 API를 제공하는 server)

Resource Server

  • 인증 후 Resource를 제공해주는 서버이다. 여기서 말하는  Resource란 인증된 사용자만 접근할 수 있는 자원들을 의미한다.

 

OAuth2.0 서비스 이용

client는 oAuth2 서비스를 이용하기 위해 Resource(사용자의 정보)를 가지고 있는 Resource Server(Google, Naver 등)에 client의 주소를 등록하여 승인을 받아야한다.

 

등록을 하게 되면 oauth 서비스를 이용하는데 핵심적인 정보 3가지를 부여받게 된다.

1. Client Id

  • 클라이언트를 구분할 수 있는 식별자(단순 id이기 때문에 노출해도 상관없음)

2. ClientSecret

  • Clinet Id에 대한 패스워드(노출이 되면 안됨)
  • 보안을 강화하기 위해 Client Secret을 사용함

3. Authorized Redirect URI

  • Resource Server만 갖는 정보
  • client에 권한을 부여하는 과정에서 나중에 Authorized code를 전달하는 통로

 

OAuth2.0의 흐름(Authorazation Code Grant)

1. 서비스 접근 및 이용 시도

Resource owner 즉 사용자가 인증이 필요한 client의 서비스에 접근하기 위해 로그인을 해야한다. 

따라서 우리는 Authorization Server에서 제공하는 인증 서비스를 이용할 예정이다.

 

2. Client ID, Redirect_URI

사용자에게 로그인 시 Resources Server에게 보낼 정보(Client Id, Redirect_URI)를 보내준다.

 

3. 로그인 페이지 요청

로그인 서비스 요청 시 URL에Client ID와 Rediect URL을 파라미터로 포함시켜 Client가 등록한 OAuth 인증 서비스를 요청한다.

요청한 URL을 자세하게 살펴보면

https://kauth.kakao.com/oauth/authorize?
scope=profile_nickname%20profile_image
&response_type=code
&state=i4qsJEmY2ROUDtyDWJj-nsvVMuqI07ogmyvBMYmOX1M%3D
&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Flogin%2Foauth2%2Fcode%2Fkakao
&client_id=123
URL 설명
scope Client에서 등록한 사용 권한
response_type=code 어플리케이션이 Authorization Code인증을 사용한다는 것을 의미
즉 인증 과정을 백엔드에서 진행하면 authorization_code 인증을 사용

반대로 코드교환과정 없이 바로 access token을 발급받으면 token
즉 JavaScript SPA에 사용하기 위해 만들어짐
Implicit Grant라고 부름
state CSRF공격을 막기위해 생성되는 임의의 숫자
사용자가 인증 후 동일한 값이 반환되는지 확인
redirect_uri 요청 승인 후 사용자에게 다시 보낼 uri
client_id Client의 고유 ID

 

4. 로그인 페이지 제공

Resourece Server에서 제공하는 로그인 페이지로 이동한다.

 

5. ID 및 비밀번호 입력

OAuth를 제공하는 Authorization ServerID와 PW를 입력하여 로그인을 시도한다

 

6. Authorization Code발급 

Authorization Code는 Access Token을 받기 위한 권한 임시 코드이다. ID와 PW를 입력하여 Authorization Server에서 인증을 마치고 나면 발급된 Authorization Code를 Resource Owner(사용자)에게 전달한다.

 

7. Redirect_URI로 Authorization Code 전달

 등록한 Redirect_URI로 Redirection 시키는데 Redirect_URI에 Authorization Code를 내포시켜 보내준다.

 

8. Authorization Code으로 Access Token 요청 

Authorization Server에 Authorization Code를  URL에 담아 전달하여  Access Token을 요청한다.

 

9. Access Token 발급

Authorization Server에서 전달받은 Authorization Code의 유효 여부를 확인 후 Access Token을 발급하여 Client전달한다.

 

10. 로그인 성공

인증과정을 모두 거치고 Access Token을 발급받고 나면 로그인을 성공적으로 마칠 수 있다.

 

11 ~ 12. 서비스 요청 후 API 호출

Resource Server의 API가 필요한 protected Resource(제한된 정보)를 요청 시 Client에서 Resource Server로

URL에 AccessToken을 담아 API 호출한다.

 

13 ~ 14. 서비스 제공

Resource Server에서 Access Token을 통해 어떤 사용자가 어떤 정보를 요청하는 지를 확인하여 Client에 보내준 후 사용자에게 서비스를 제공한다

Comments