위클리 페이퍼 (15)

깨진알·2024년 2월 26일

Weekly-Paper

목록 보기
13/14

15주차 위클리 페이퍼

Q1) 세션 기반 인증과 토큰 기반 인증을 비교해서 설명해 주세요.

(1) 인증과 인가

인증(Authentication)은 쉽게 말하자면, 로그인과 같은 개념이다. 클라이언트가 자신이라고 주장하고 있는 사용자가 맞는지를 검증하는 과정이다.

인가(Autorization)는 인증 작업 이후에 행해지는 작업으로, 인증된 사용자에 대한 자원에 대한 접근 확인 절차를 의미한다.

(2) HTTP의 비상태성(Stateless)

HTTP는 비상태성이라는 특성을 가진다. 서버는 클라이언트의 상태를 저장하지 않으며, 따라서 이전 요청과 다음 요청의 맥락이 이어지지 않는다. HTTP는 바로 직전에 발생한 통신을 기억하지 못하기 때문에 HTTP 단독으로 요청한 클라이언트가 이전에 이미 인증과정을 거쳤는지 알 방법이 없다.

그렇다면 사용자의 아이디와 비밀번호를 브라우저에 그대로 저장해놓고, 매 요청마다 함께 그 정보를 보내는 방법은 전송 데이터가 커져 비효율적인 뿐더러 클라이언트에 민감한 데이터가 그대로 저장되어 보안에도 취약하다. 서버 입장에서도 매 작업마다 데이터베이스를 조회하고, 인증과정을 거치는 것이 비효율적일 것이다.

(3) 세션 기반 인증

세션 기반 인증는 사용자의 인증 정보가 서버의 세션 저장소에 저장되는 방식이다. 사용자가 로그인을 하면, 해당 인증 정보를 서버의 세션 저장소에 저장하고, 사용자에게는 저장된 세션 정보의 식별자인 ID를 발급한다. 발급된 ID는 브라우저에 쿠키 형태로 저장되지만, 실제 인증 정보는 서버에 저장되어 있다.

브라우저는 인증 절차를 마친 이후의 요청마다 HTTP Cookie 헤더에 ID를 함께 서버로 전송한다. 서버는 요청을 전달받고, ID에 해당하는 세션 정보가 세션 저장소에 존재한다면 해당 사용자를 인증된 사용자로 판단한다.

(4) 토큰 기반 인증

세션 기반 인증이 인증 정보를 서버에 저장하는 방식이라면 토큰 기반 인증은 인증 정보를 클라이언트가 직접 들고 있는 방식이다. 이때 인증 정보가 토큰의 형태로 브라우저의 로컬 스토리지에 저장된다. 토큰의 종류에 따라 다르겠지만, 대표적인 토큰인 JWT의 경우 디지털 서명이 존재해 토큰의 내용이 위변조되었는지 서버측에서 확인할 수 있다.

토큰 기반 인증에서는 사용자가 가지고 있는 토큰을 HTTP의 Authorization 헤더에 실어 보낸다. 이 헤더를 수신한 서버는 토큰이 위변조되었거나, 만료 기간이 지나지 않은지 등을 확인한 후 토큰에 담겨있는 사용자 인증 정보를 확인해 사용자를 인가한다.

(4) 세션 기반 인증 vs 토큰 기반 인증

1. 사이즈

세션의 경우 Cookie 헤더에 ID만 보내면 되기 때문에 트래픽을 적게 사용한다. 하지만 JWT는 사용자 인증 정보와 토큰의 발급시각, 만료기간, 토큰의 ID 등 담겨있는 정보가 세션 ID에 비해 비대하므로 세션 방식보다 훨씬 더 많은 네트워크 트래픽을 사용한다.

2. 안정성과 보안문제

세션의 경우 모든 인증 정보를 서버에서 관리하기 때문에 보안 측면에서 조금 더 유리하다. 세션 ID가 해커에게 탈취된다고 해도, 서버측에서 해당 헤션을 무효 처리하면 된다. 토큰은 서버가 트래킹하지 않고, 클라이언트가 모든 인증 정보를 가지고 있다. 따라서 토큰이 한번 해커에게 탈취되면 해당 토큰이 만료되기 전까지는 속수무책으로 피해를 입을 수 밖에 없다.

JWT 특성상 토큰에 실린 Payload가 별도로 암호화 되어있지 않으므로, 누구나 내용을 확인할 수 있다. 따라서 Payload에 민감한 데이터는 실을 수 없다. 즉, Payload에 실을 수 있는 데이터가 제한된다. 하지만 세션과 같은 경우에는 모든 데이터가 서버에 저장되기 때문에 아무나 함부로 열람을 할 수 없으므로 저장할 수 있는 데이터에 제한이 없다.

3. 확장성

일반적으로 웹 애플리케이션의 서버 확장 방식은 수평 확장을 사용한다. 즉, 한대가 아닌 여러대의 서버가 요청을 처리하게 된다. 이때 별도의 작업을 해주지 않는다면, 세션 기반 인증 방식은 세션 불일치 문제를 겪게 된다. 이를 해결하기 위해 Sticky Session, Session Clustering, 세션 스토리지 외부 분리 등의 작업을 해주어야 한다.

하지만, 토큰 기반 인증 방식의 경우 서버가 직접 인증 방식을 저장하지 않고, 클라이언트가 저장하는 방식을 취하기 때문에 이런 세션 불일치 문제로부터 자유롭다. 이런 특징으로 토큰 기반 인증 방식은 HTTP의 비상태성을 그대로 활용하 수 있고, 높은 확장성을 가질 수 있다.

4. 서버의 부담

세션 기반 인증 방식은 서비스가 세션 데이터를 직접 저장하고 관리한다. 따라서 세션 데이터의 양이 많아지면 많아질수록 서버의 부담이 증가한다. 반면에 토큰 기반 인증 방식은 서버가 인증 데이터를 가지고 있는 대신, 클라이언트가 인증 데이터를 직접 가지고 있다. 따라서 유저의 수가 얼마나 되던 서버의 부담이 증가하지 않는다.

profile
프론트엔드 지식으로 가득찰 때까지

0개의 댓글