Skip to main content

Command Palette

Search for a command to run...

[Authentication] Session vs JWT

Updated
2 min read

1. 쓰는 이유

  • 주변에서 토큰 기반 인증을 많이 사용해서 평소 사용자 인증 기능을 구현할 때 JWT 인증을 주로 사용했다.

  • 그러나 백엔드 기초 강의를 보면 세션 (session) 기반 인증을 사용하는 경우도 종종 있다.

  • 그래서 궁금했다. 1) 두 가지 인증 방식은 어떤 차이가 있고, 2) 각각 어떤 경우에 사용하는 게 적절한 것인지.

2. 본문

개념 이해

Session

  • 세션에 사용자 정보를 담아서 데이터베이스에 저장하고, 쿠키를 통해 세션 아이디를 클라이언트에 보냄. (세션 정보는 서버에 저장)

JWT

  • 사용자 정보가 유효하면 토큰을 발급하여 클라이언트로 보내주고, 토큰에는 1) 헤더, 2) 내용, 3) 서명 데이터가 담겨 있다.

보편성 (Winner: JWT)

  • 최근에는 확실히 토큰 기반 인증 방식이 유행이라고 한다.

  • 그 이유는 최근에 마이크로 서비스 아키텍처가 유행이라서 그렇다. (자세한 내용은 아래 '확장성'에서 확인)

  • 물론 호불호가 갈리지만, 트렌드는 무시할 수 없을 것 같다.

확장성 (Winner: JWT)

  • 최근 마이크로 서비스 아키텍처 (MSA)가 도입되면서, 서버가 여러 개일 경우 서버 간 세션 정보를 공유할 수 있는 방법이 필요하다.

  • 세션을 사용할 경우, sticky session, session clustering, session storage (데이터베이스에 저장하는 방식)을 이용하면 해결이 되긴 하지만, 전부 서버 측 부담을 주는 방법이다. 그러나 사용자 인증정보를 클라이언트 측에 저장하는 JWT 방식은 서버에 부담을 안 주고 사용자 인증이 가능하다.

  • JWT는 서버에 인증 방식을 저장하지 않으므로, HTTP의 비상태성 (stateless) 특징을 유지시킬 수 있다.

보안성 (Winner: Session)

  • 세션의 경우, 인증 정보를 서버에서 관리하기 때문에 인증 정보를 클라이언트에서 관리하는 JWT 방식보다 안전하다고 한다.

예) 해커가 인증정보를 탈취했을 때, 세션의 경우에는 데이터베이스에 있는 정보를 삭제하거나 무효화하면 되지만, 토큰 방식은 토큰의 유효기간이 지날 때까지 별도의 삭제 방법이 없다는 것이 큰 단점이다.

  • 또한, JWT는 payload에 사용자 정보를 암호화하지 않기 때문에 토큰이 탈취되면 사용자 정보도 함께 탈취되는 것이며, 이는 쿠키에 세션 아이디만 저장하는 방식보다 위험하다.

사이즈 (Winner: Session)

  • Why JWTs Suck as Session Tokens 에 따르면, 토큰 방식은 세션 방식에 비해 네트워크 트래픽을 훨씬 많이 사용한다고 한다.

  • 같은 사용자 정보를 저장하는데 sesison 방식은 쿠키 사이즈가 6 bytes인 반면, JWT는 토큰 사이즈가 304 bytes이라고 한다. (약 50배)

  • 따라서 트래픽 크기 관리가 중요한 서비스는 session이 유리할 수도 있다.

3. 결론

  • 어떤 인증 방식이 훨씬 유리하다고 할 수는 없지만, 요즘처럼 MSA 아키텍처가 유행하는 시대에서 JWT의 인기가 많은 것이 사실이다.

  • 서비스 종류와 목적에 맡게 인증 방식을 선택하면 될 것 같고, 딱히 차이가 없다고 생각하면 트렌디한 JWT를 선택하면 될 것 같다.

4. 참고 자료

More from this blog

[ZSH] tree 사용하기

들어가며 큰 규모의 프로젝트를 출시한 뒤, 후일을 위해서 더 늦기 전에 파일 정리 및 문서화를 진행해야했다. 문서화 작업을 하는 중에 기왕 정리하는 거 파일 구조를 이쁘게 트리 구조로 나열하여 코멘트를 달면 나중에 보더라도 이해하기 더 쉬울 것 같았다. 어떻게 해야 간지나는 트리 구조를 만들 수 있을까 방법을 찾다보니 역시나 파일 구조를 트리로 이쁘게 출력해주는 커맨드 툴이 존재했다. tree 커맨드에 대해서 알아보고 알짜배기 내용만 정리했다....

Feb 21, 20242 min read

[Next.js] parallel routes & intercepting routes

트위터 로그인 모달창을 만들어보며 넥스트의 parallel routes 와 intercepting routes 을 학습한 내용을 정리해보았습니다. 트위터 로그인 창을 확인해봅시다. 루트 디렉토리 화면을 배경으로 i/flow/login 페이지가 동시에 표시되고 있습니다. 저는 app router 를 학습하기 전까지는 createPortal 을 사용하여 포탈 영역에 로그인 컴포넌트를 띄우는 방식을 사용했었습니다. const NoLogin =()=...

Feb 1, 20244 min read

C/C++ 이진 트리(binary tree) 개요 및 구현(1)

개요 트리는 노드들이 나무 가지처럼 연결된 비선형 계층적 자료구조이다. 하위 트리가 존재하고, 그 노드에 또 하위 트리가 존재하는 자료구조 이다. 트리의 맨 위에 있는 루트 노드가 존재한다. 우리가 알아볼 트리는 이진 트리이다. 이진 트리는 자식 노드(부모로부터 아래로 이어진 노드)가 2개 이하인 구조를 말한다. 트리의 사용 사례로는 다음과 같다 계층 적 데이터 저장(파일,폴더) 효율적인 검색 속도 힙 데이터 베이스의 인덱싱 트리에 ...

Jan 31, 20244 min read

[React] Server component (RSC)

React.js 18 에 도입된 리액트 서버 컴포넌트는 서버에서 동작하는 리액트 컴포넌트를 의미합니다. Next가 권장하는 라우팅 방식인 app router의 기반이 되는 컴포넌트이기 때문에 app router 를 이해하기 위해서는 server component 에 대한 이해가 필요합니다. server component 리액트는 클라이언트단만을 컴포넌트화하는 대신, server component라는 개념을 통해 서버 영역을 컴포넌트화합니다. ...

Jan 29, 20243 min read

Flutter, JavaScript

42 posts

[Authentication] Session vs JWT