본문 바로가기

CS/WEB

JWT, 사용자 인증 방식 정리

이전 개인프로젝트를 진행하면서 JWT를 이용하여 인증하는 방식을 택했는데,

JWT에 대해 제대로 알아보고자 글로 정리하면서 학습해보겠습니다.

 

서버가 클라이언트 인증을 확인하는 방식 3가지 : Cookie, Session, Token

 

클라이언트가 사용자 인증을 하면 그 인증을 유지할 수 있도록 쿠키와 세션을 사용해왔다.

 

but, 쿠키는 탈취 가능성이 있다. 보안에 취약하다

세션은 유저의 인증정보를 서버쪽에서 유지함.-> 서버의 확장성이 떨어진다

     서버의 메모리를 차지하여 요청이 많을 경우 서버 과부하의 원인이 된다.

토큰도 탈취 가능성이 있지만 accessToken 유효기간을 짧게 설정하고, refreshToken을 따로 저장해서 보완할 수 있습니다.

 

-> 이를 보완하고자 토큰 기반 인증 시스템이 도입되었다.

 

* 세션 : 방문자가 웹서버에 접속해있는 상태를 하나의 단위로 본다. 브라우저를 닫거나 서버에서 세션을 삭제했을때 삭제된다.


Token 인증 방식:

  • 클라이언트가 서버에 접속하면 서버에서 해당 클라이언트가 인증되었다는 의미로 'Token'을 부여
  • 클라이언트는 서버에 요청을 보낼 때 요청 헤더에 토큰을 포함시켜 전송한다.
  • 서버에서는 클라이언트로부터 받은 토큰을 검증하고 요청에 응답한다.

토큰 방식의 단점 :

  • 토큰 자체의 데이터 길이가 길어 인증 요청이 많아질수록 네트워크 부하가 심해질 수 있다.
  • Payload 자체는 암호화되지 않는다.
  • 토큰 탈취 가능

JWT(JSON Web Token) : Json객체에 인증에 필요한 정보를 담은 후 비밀키로 서명한 토큰이다.

 

인증에 필요한 정보를 암호화시킨 JSON 토큰이다. HTTP헤더에 JWT 토큰을 실어 서버가 클라이언트를 식별하는 방식이다.

JWT는 토큰 기반인증에서 주로 사용하는 토큰 중 하나이다.

JWT 토큰을 이용하면 stateless 특징을 유지하면서 로그인 상태 유지를 할 수 있다.

* 서버의 무상태 구조(Stateless) : 서버가 클라이언트의 상태를 보존하지 않음.

클라이언트와 서버 간 통신에 필요한 모든 상태 정보들을 클라이언트에서 가지고 있다가 서버와 통신할 때 데이터를 실어 보낸다. 이를 통해 서버는 상태유지(Stateful)에 대한 부하가 줄어든다 + 서버1에서 문제가 생겨 서버2가 이어받아도 응답을 동일하게 할 수 있다(서버확장 가능)

 

.를 구분자로 헤더.내용.서명 으로 구성된다.

Source : Cookies vs. Tokens: The Definitive Guide – https://dzone.com/articles/cookies-vs-tokens-the-definitive-guide

 

Header 는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다.

Payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다. (Claim들을 담을 수 있다)

Signatur는 (헤더+페이로드)와 서버가 갖고 있는 비밀키를 합친 것을 헤더에서 정의한 알고리즘으로 암호화한다. 토큰의 위변조 여부를 확인하는데 사용된다. (HS256방식 - 비밀키 방식, HMAC과 SHA256사용,  메세지를 해싱해서 무결성확보)

JWT의 장점

  • 데이터 위변조를 막을 수 있다.
  • 인증 정보에 대한 별도의 저장소가 필요 없다.
  • 서버는 무상태(stateless)가 되어 서버 확장성이 우수.
  • 토큰 기반으로 다른 로그인시스템에 접근 및 권한 공유가 가능하다(쿠키와 차이)

 

JWT의 단점

  • 토큰 자체에 정보를 담고 있다. 토큰 자체를 탈취당할 수 있다.
  • 토큰에 담는 정보가 많아질수록 토큰 길이가 늘어나 네트워크에 부하를 줄 수 있다.
  • Payload가 탈취당할 수 있어서 중요 데이터를 넣을 수 없다.

JWT - AccessToken / Refresh Token 활용으로 보안 강화

JWT 토큰의 탈취 위험성으로 인해 AccessToken(유효기간 짧게 설정)과 RefreshToken을 함께 발급하고. AccessToken은 클라이언트에 부여, RefreshToken은 DB에 저장한다. 

리프레시 토큰은 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급하는 용도로 사용한다.

 

 

Oauth와 JWT의 차이점

Oauth와 달리 JWT는 토큰 자체가 의미를 갖는 Claim 기반의 토큰 방식이다.

Oauth는 사용자 인증 프로토콜이 아닌 인가 프로토콜이다.

 

인증 : 사용자의 신원을 검증하는 행위

인가 : 사용자에게 특정 리소스나 기능에 액세스할 수 있는 권한을 부여하는 것

 


Oauth

Oauth : 구글과 트위터가 만든 개방형 인가의 표준이다. 

소셜로그인 : 유저가 해당 웹사이트에 가입한 ID와 패스워드 대신 다른 사이트에 있는 유저 정보를 사용해 인증하는 기능.

 

access token : 리소스 서버에서 리소스 소유자의 보호된 정보를 획득할 때 사용

리소스 소유자(resource owner) : 사용자. 리소스(사용자의 보호된 정보)에 접근하도록 자격을 부여하는 사람

클라이언트 : 리소스를 사용하려고 접근을 요청하는 애플리케이션

리소스 서버(resource server) : 사용자의 보호된 자원을 가지고 있는 서버

인가 서버(authorization sever) : 인증/인가를 수행하는 서버. 클라이언트의 접근 자격을 확인하고 액세스 토큰을 발급하여 권한을 부여한다.

 

Oauth 프로토콜의 흐름

출처 : https://goldenrabbit.co.kr/2023/08/07/oauth%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EA%B5%AC%EA%B8%80-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9D%B8%EC%A6%9D%ED%95%98%EA%B8%B0-1%ED%8E%B8/

 

 

 

참고 : https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

 

🌐 JWT 토큰 인증 이란? (쿠키 vs 세션 vs 토큰)

Cookie / Session / Token 인증 방식 종류 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해

inpa.tistory.com

 

https://goldenrabbit.co.kr/2023/08/07/oauth%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EA%B5%AC%EA%B8%80-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9D%B8%EC%A6%9D%ED%95%98%EA%B8%B0-1%ED%8E%B8/

 

OAuth를 사용한 구글 로그인 인증하기 1편 - OAuth 소개와 준비하기 - 골든래빗

'[Node.js] 자바스크립트 비동기 개념에 익숙해지기'는 총 3편에 걸쳐서 콜백 함수, 프로미스, async await 구문을 소개할 예정입니다. 1편에서는 자바스크립트 비동기 개념을 이해하고, 콜백 함수 예

goldenrabbit.co.kr