본문 바로가기

소프트웨어-이야기/아키텍처

개발자를 위한 최소한의 인증 시스템 지식: Oauth2.0 + HTTP

JWT

인증에 필요한 정보를 암호화한 Token이다. 

https://jwt.io/

 

JWT 구성을 살펴보자. JWT은 3가지 구성요소로 나뉜다. 각 구성영역은 토큰의 점으로 구분된다. 

  • header
  • payload
  • signature

 

JWT이 등장한 배경

요구사항

  • 로그인을 하려면 아이디와 패스워드가 필요하다. 그리고 로그인을 일정 시간동안 유지해야한다. 
  • 아이디와 패스워드를 매번 보내주려면, 어딘가에 이 정보를 저장해야한다. 

대안

(1) 아이디와 패스워드를 API를 요청할 때마다 전달하기 

  • 아이디와 패스워드를 사용자에게 매번 입력받는 것은 무리이다.
  • 그래서 클라이언트 저장소에 아이디와 패스워드를 저장해서, 매번 전달해야한다.
  • 쿠키에 아이디, 패스워드를 저장해서 전달하는 안이 있다.
    • 그러나 개인 민감정보가 쿠키에 담겨있는 것은 보안상 안전하지 않다.
    • 그리고 쿠키의 크기는 브라우저마다 제한되기 때문에 활용을 지양하는 것이 좋다. 

(2) 세션 ID 사용하기 

  • 방법
    • 클라이언트가 아이디/패스워드를 전달하여, 로그인을 시도한다.
    • 서버는 클라이언트에 세션 ID를 발급한다.
    • 클라이언트는 HTTP Header에 세션 ID를 담아서 전달한다.
    • 서버는 세션 ID가 유효한지 인증 서버를 통해 확인한다.
    • 인증 서버는 글로벌 캐시를 사용해 세션 ID를 관리한다. 
  • 단점
    • 이 방법은 인증이 필요한 도메인 서버가 인증 서버에 항상 의존한다는 단점이 있다.
    • 이는 응답지연, 단일 장애 포인트 (SPOF)를 일으킬 수 있다.

Oauth 2.0: JWT으로 Access Token을 만들어서, 인증하기 

refresh token은 생략되었음

토큰 유효성 검증

  • jwt payload의 exp (Expiration Time)을 사용해 토큰 만료 여부 판단 
  • jwt paylaod 안에서 회원 식별자를 구해옴

 

HTTP  통신 방법

HTTP 통신에서 인증을 하려면, Authorization header에 인증 타입과 인증 정보를 포함하여 요청을 전달하면 된다. 

Authorization: <type> <credentials>

header 형태는 위와 같다.

 

인증 타입

HTTP 인증 방법은 크게 Basic과 Bearer으로 나뉜다.

Basic 

Authorization: basic ID와_패스워드를_base64으로_인코딩한_값

Bearer 

Authorization: Bearer OAUTH_인증으로_얻은_access_token

 

참고

https://brunch.co.kr/@jinyoungchoi95/1

https://tansfil.tistory.com/58

https://velog.io/@tosspayments/Basic-%EC%9D%B8%EC%A6%9D%EA%B3%BC-Bearer-%EC%9D%B8%EC%A6%9D%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83