JWT, OAuth2

hyyyynjn·2021년 9월 13일
1

당나귀 프로젝트

목록 보기
5/6
post-thumbnail

서버 기반 인증 방식

JWT에 대해 알기 위해서 서버 기반 인증 방식에 대해 알아야 한다.
서버 기반 인증 방식의 핵심은 서버측에 유저 정보를 저장하는 것이다. 서버는 사용자가 로그인을 하면 해당 유저의 세션을 만들고 서버의 메모리와 데이터베이스에 이를 저장한다.

Access Token, Refresh Token

Access Token

리소스에 직접 접근할 수 있도록 해주는 정보만을 가지고 있다.
Refresh Token보다 짧은 만료기간을 가지며, 주로 세션에 담아 관리한다. (데이터베이스에 저장하지 않는다)

Refresh Token

새로운 Access Token을 발급받기 위한 정보를 담고 있다.
클라이언트가 Access Token이 없거나 만료되면 Refresh Token을 통해 Authorization Server에 요청하여 새로운 Access Token을 발급 받을 수 있다.
외부에 노출되지 않도록 이를 데이터베이스에 저장한다.

OAuth2.0

OAuth2.0
인증을 위한 표준 프로토콜이다.
구글, 네이버 등에서 제공하는 Authorization Server를 통해 회원 정보를 인증하고 Access Token을 발급 받는다.
발급 받은 Access Token을 통해 타사의 API 서비스를 이용할 수 있다.

Authorization Server는 API 호출 요청에 대해서 Access Token이 유효한지 확인해야한다. 또한 API를 호출할 때마다 Access Token이 유효한지 매번 데이터베이스에서 조회하고 새로 갱신시 업데이트 작업을 해줘야한다.

JWT

JWT
정보를 JSON 객체 형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 Token이다.
JWT는 사용자에 대한 프로퍼티 속성 기반의 Claim이라는 방식을 사용한다.

JWT의 Token은 유저의 상태와 같은 의미있는 토큰으로 구성되어 있기에 Authorization Server 측의 비용을 절감하면서 Stateless한 아키텍쳐를 구성할 수 있다.
👉 이렇게 되면 Application Server는 로그인한 사용자의 세션을 관리하지 않고, 전달받은 JWT가 유효한 Token인지만 확인한다.

JWT의 장점

확장성

📌세션을 이용한다면
서버를 확장할 때마다 각 서버에 세션 정보를 저장하게 된다.
서버A에 로그인 인증을 받을 때 다른 서버B가 확장하게 되면 서버B는 사용자가 로그인 했는지 알 수 없다

📌JWT를 사용한다면
서버가 확장해도 토큰을 인증하는 방식만 알면 사용자 인증에 대한 문제가 발생하지 않는다.
가장 중요한 점은 Web, App 간의 쿠키/세션 처리에 좋다. (브라우저와 앱에서의 쿠키 처리 방법이 다르기 때문에 JWT를 이용하는게 다양한 디바이스 차원에서 좋다)

보안성

Client가 Server로 Request를 보낼 때, 쿠키를 전달하지 않기 때문에 쿠키를 사용함으로서 발생하는 보안 취약성이 사라진다.

서버 기반 인증 시스템의 문제인 CORS문제를 해결해준다.
쿠키는 발행한 서버에 한하여 유효하기 때문에 'www.one.ozofwerid.com'에서 발행한 쿠키가 'www.two.ozofweird.com'에서 사용할 수 없다.
하지만 JWT는 어떠한 도메인에서도 토큰만 유효하면 처리가 가능하다.

JWT의 단점

Client의 모든 Request에 대해 Token이 전송되기 때문에 데이터 증가로 인한 네트워크 부하가 생긴다.
또한 JWT가 만료되기 전에 탈취당하면 이를 처리할 방법이 없다.
토큰은 임의로 삭제할 수 없기 때문에 반드시 마료 시간을 필수적으로 설정해줘야한다.

📢JWT, OAuth2의 큰 문제점

공식 문서에 따르면 Spring Security 에서 Authorization Server지원이 적합하지 않다고 판단했고, 오픈 소스 인증 서버가 많이 있다고 생각해 더이상 지원하지 않기로 결정했다고 한다

👉 이를 해결하기 위해서

  • Spring Boot를 1.x 버전대로 낮추어 해결하던지
  • 2.x 버전대와 1.x 버전의 호환성을 위한 dependency 추가해야 한다.

0개의 댓글