티스토리 뷰

반응형

 

Spring Security와 OAuth를 이용하여 로그인 기능을 구현하기 위해 OAuth 2.0에 대해 공부해 봤다.

 

 

인증과 인가?

  1. 인증(authentication) : 사용자의 신원을 확인하는 절차이다. 
  2. 인가(authorization) : 사용자가 어떤 리소스에 접근할 수 있는지 또는 어떤 동작을 수행할 수 있는지를 검증하는 절차이다. 

 

 

 

OAuth 2.0 이란 ?

OAuth 2.0(Open Authorization 2.0, OAuth2)란 표준 인증 프로토콜이다.

 

Oauth는 인증(authentication)에 대한 프로토콜이다. (인가를 고려한 프로토콜은 아님)

Oauth는 사용자의 ID와 비밀번호 없이도 접근 권한을 위임 받을 수 있는 표준 인증 프로토콜이다.

Oauth는 다른 웹사이트(구글, 네이버, 카카오 등)에서 제공하는 API를 이용하여 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로써 사용된다.

 

Oauth를 이용한 로그인 서비스 예시

  • 아래와 같은 간편 로그인기능을 한번쯤은 봤을 것이다.

예시 - 인프런 로그인창

 

 

 

OAuth를 통해 접근 권한을 위임 받으면 어떠한 이점이 있을까 ?

다른 웹사이트로 부터 접근권한을 부여받기 위해 인증 프로토콜을 이용하지 않고 비밀번호를 이용하는 경우

아래와 같은 문제들을 생각해 볼 수 있다.

  • 신뢰할 수 없음 - 사용자가 애플리케이션에 ID와 비밀번호를 제공하기 꺼려함
  • 넓은 접근 범위 - 애플리케이션에 필요한 데이터 뿐만 아니라 사용자 계정의 모든 데이터에 접근할 수 있음
  • 보안 - 개인정보가 유출될 위험이 큼. (피싱에 둔감)
  • 사용성 - 사용자가 비밀번호를 바꾸면, 애플리케이션은 사용자의 데이터에 접근하지 못함
    즉, 비밀번호에 대한 의존성이 생김

OAuth 2.0을 이용하면 위와 같은 문제들을 해결할 수 있다.

 

구글,네이버 그리고 카카오 같은 서비스에 직접 ID/PW를 입력할 뿐,

애플리케이션에는 ID/PW를 입력할 필요가 없게 되는 것이다.

 

 

 

OAuth 2.0 구성

OAuth 2.0에서 정의하는 4가지 역할

 

1) Resource Owner(사용자) : 사용자이자 리소스 소유자. 리소스의 접근을 허가해 준다.

 

2) Client (애플리케이션) : Resource Owner를 대신하여 권한을 부여하고 보호된 리소스를 Resource Server에 요청하는 애플리케이션이다.

 

3) Resource Server(API 서버) : 보호받는 리소스를 호스팅한다. 액세스 토큰을 발급받은 클라이언트의 요청을 수락하고 응답할 수 있는 서버이다.

 

4) Authorization Server(인증 서버) : Resource Owner 인증을 통해 클라이언트에 액세스 토큰을 발급해 주는 서버이다.

 

추가로, 뒤에서 확인할 Flow에서 User-Agent는 웹 브라우저에 해당된다.


Authorization Server와 Resource Server는 구성에 따라 아키텍처가 달라질 수도 있다. Authorization Server와 Resource Server가 동일한 서버일 수도 있고 별개로 동작할 수도 있다. 또는 하나의 Authorization Server가 여러 Resource Server에 액세스 토큰을 발급할 수도 있다.

 

 

 

OAuth 2.0의 인증방식

OAuth2.0에서 Client는 Authorization server에게 4가지 인증방식으로 토큰을 요청할 수 있다.

 

1) Authorization Code Grant

2) Implicit Grant

3) Client Credentials Grant

4) Resource Owner Password Credentials Grant

 

인증방식에 따른 OAuth의 흐름은 아래의 그림으로 간단하게 확인할 수 있다.

 

 

 

그림으로 보는 OAuth 2.0 의 흐름

4가지 인증방식에 따른 OAuth의 흐름 : 출처

 

  • Authorization Code Grant Flow
     <noMenu/>
     
     +----------+
     | Resource |
     |   Owner  |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier      +---------------+
     |         -+----(A)-- & Redirection URI ---->|               |
     |  User-   |                                 | Authorization |
     |  Agent  -+----(B)-- User authenticates --->|     Server    |
     |          |                                 |               |
     |         -+----(C)-- Authorization Code ---<|               |
     +-|----|---+                                 +---------------+
       |    |                                         ^      v
      (A)  (C)                                        |      |
       |    |                                         |      |
       ^    v                                         |      |
     +---------+                                      |      |
     |         |>---(D)-- Authorization Code ---------'      |
     |  Client |          & Redirection URI                  |
     |         |                                             |
     |         |<---(E)----- Access Token -------------------'
     +---------+       (w/ Optional Refresh Token)

 

 

  • Implicit Grant Flow
     <noMenu/>
     
     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier     +---------------+
     |         -+----(A)-- & Redirection URI --->|               |
     |  User-   |                                | Authorization |
     |  Agent  -|----(B)-- User authenticates -->|     Server    |
     |          |                                |               |
     |          |<---(C)--- Redirection URI ----<|               |
     |          |          with Access Token     +---------------+
     |          |            in Fragment
     |          |                                +---------------+
     |          |----(D)--- Redirection URI ---->|   Web-Hosted  |
     |          |          without Fragment      |     Client    |
     |          |                                |    Resource   |
     |     (F)  |<---(E)------- Script ---------<|               |
     |          |                                +---------------+
     +-|--------+
       |    |
      (A)  (G) Access Token
       |    |
       ^    v
     +---------+
     |         |
     |  Client |
     |         |
     +---------+

 

 

  • Client Credentials Grant Flow
     <noMenu/>
     
     +---------+                                  +---------------+
     |         |                                  |               |
     |         |>--(A)- Client Authentication --->| Authorization |
     | Client  |                                  |     Server    |
     |         |<--(B)---- Access Token ---------<|               |
     |         |                                  |               |
     +---------+                                  +---------------+

 

 

  • Resource Owner Password Credentials Grant Flow
     <noMenu/>
     
     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          v
          |    Resource Owner
         (A) Password Credentials
          |
          v
     +---------+                                  +---------------+
     |         |>--(B)---- Resource Owner ------->|               |
     |         |         Password Credentials     | Authorization |
     | Client  |                                  |     Server    |
     |         |<--(C)---- Access Token ---------<|               |
     |         |    (w/ Optional Refresh Token)   |               |
     +---------+                                  +---------------+

 

 

 

 

반응형

'개발 공부 > Spring Security' 카테고리의 다른 글

[OAuth 2.0] Authorization Code Grant 인증방식  (0) 2022.07.05
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함