인증, 인가, JWT, Session, OAuth

인증과 인가

API Authentication(인증)이란

- API 리소스 접근을 허용하기 전에 사용자의 신원을 확인하는 것

 

Authentication(인증) : 신원을 확인 (신분증!)

Authorization (인가) : 특정 리소스에 접근을 허가 또는 거절 (등급별 게시판 조회!)


대표적인 인증 방법 네가지

  1. Basic Authentication
    • 이름에서 알 수 있듯이 가장 간단한 형태
    • HTTP 인증은 헤더에 저장된다. 이 때 Base64로 인코딩 된다.
    • 인증 정보가 평문으로 전달되어 보안이 좋지 않다.
    • 매 HTTP 요청에서 인증을 진행한다. (서버로 ID/PWD를 전송)
  2. Token Authentication
    • 사용자 별 고유한 토큰을 이용한다.
    • 매 HTTP 요청의 헤더에 토큰을 저장한다.
    • 토큰에 지정된 세션 동안 인증과 인가가 진행된다.
  3. OAuth Authentication
    • 인증을 위한 표준 프로토콜.
    • Twitter, Facebook, Google과 같이 외부 소셜 서비스 기반으로 Thrid-Party 프로그램(우리가 개발하는 웹)에 간편하게 인증을 한다.
    • Third-Party 프로그램이 (클라이언트 대신) 직접 서버에 접근 권한을 위임 받는 방식을 말한다.
    • 외부 서비스의 OAuth 인증을 이용해 사용자의 ID/PWD 공유 없이도 데이터에 대한 액세스 권한을 부여할 수 있다.
  4. API Key Authentication
    • 서버에서 키를 생성하여 사용자에게 제공한다.

JWT (Json Web Token)

인가를 위해 사용되는 토큰

DB에 조회할 필요가 없다.

 

Access Token

- 헤더에 추가하고 API에 통신한다. API가 vali check를 진행한다.

- 만료기간이 짧다. (몇분~ 몇시간)

- 클라이언트는 해석할 수 없다.

- JWT 형식, UUID 등 원하는 형태로 발급할 수 있다.

 

Refresh Token

 

JWT를 사용하면 클라이언트가 리소스에 엑세스 할때마다 일반적으로 Bearer라는 스키마를 사용해야하며 Authorization 헤더에 다음과 같이 정해진 규칙에의해 전송되어야합니다.

Authorization: Bearer <token>

 

JWT ↔ Session

Session의 인증 / 인가

유저는 인가가 필요할 때마다 HTTP Cookie 헤더에 세션 ID를 같이 전송합니다. 전송받은 세션 ID 자체로는 아무런 정보가 없기 때문에 세션 ID를 통해 유저를 특정하고 권한을 가지고 있는지 확인을 한 후, 서비스 또는 리소스에 대한 액세스를 허용합니다.

중복 로그인이 불가능해야 하거나 단일 디바이스에서 로그인을 해야 되는 경우, 세션을 사용하기도 합니다.

JWT 인증 / 인가

 

유저는 인가가 필요할 때마다 HTTP Authorizetion 헤더에 Bearer 형태로 토큰을 같이 전송합니다.

서버는 토큰의 서명을 검증하여 유효성을 확인한다.

https://nomal-dev.tistory.com/14


OAuth 시퀀스 다이어그램

* Resource Owner : 유저

* Client : 우리가 개발하는 웹 서비스

* Authorization Server : 

* Resource Server : 실제 ID/PWD 정보를 가진 서버

* Redirect URI : 인증을 마친 뒤 리다이렉션 될 위치

1. 로그인 요청 : 유저가 '카카오로 로그인하기' 버튼을 클릭한다.

2.

3. 로그인 페이지 제공 : 카카오 로그인 창이 뜸

4. ID/PW 제공 : 유저가 그 창에 ID/PWD를 입력함

5. Authorization Code 발급 : 로그인이 성공했을 경우 Auth server는 redirect url에 authorization code*를 포함하여 6. 유저를 리다이렉션 시킴. (* Access Token을 획득하기 위해 사용하는 코드, 수명이 매우 짧다)

7~8. 우리 서버가 AccessToken을 요청하고, 받아온 뒤, 저장함.

9. 로그인이 성공함.

10~13. 필요한 정보(성별, 이름, 나이 ...)를 요청함