티스토리 뷰
HTTP 통신의 가장 큰 특징 중 하나는 무상태성(Stateless)이다. 즉, 서버에서 클라이언트의 정보를 저장하지 않는다는 것이다. 이러한 무상태성은 클라이언트를 식별하기 까다롭다. 예를 들어 로그인한 사용자만 게시물을 작성할 수 있는 커뮤니티에 게시물 등록 요청이 서버에 도착했을 때, 이 사용자가 로그인한 사용자인지 로그인 하지 않은 사용자인지 구별할 수 없다. HTTP는 클라이언트의 상태를 저장하지 않기 때문이다.
이러한 한계를 해결하기 위해 두 가지 인증 시스템이 사용된다. 세션 기반 인증 시스템과 토큰 기반 인증 시스템이 그것이다. 오늘은 두 가지 인증 방식에 대해서 알아본다.
세션기반 인증
세션기반 인증 시스템에서는 사용자가 로그인한 후 사용자의 정보를 서버에서 관리해야 한다. 이때 쿠키에 사용자의 아이디나 비밀번호 같은 민감한 정보를 담으면 보안상 문제가 발생할 수 있다. 따라서 서버는 세션 아이디를 생성하여 세션 아이디와 함께 사용자 정보를 서버에 저장하고 세션 아이디를 쿠키에 담아 클라이언트에게 전달한다.
그리고 클라이언트에서 요청이 오면, 서버는 쿠키에 담긴 세션 아이디를 통해 사용자를 식별한다. 이렇게 클라이언트의 정보를 서버에 기억하고 있는 것을 Sateful
이라고 한다.
장점
- 클라이언트의 정보를 기억하고 있기 때문에 클라이언트를 식별하기 쉽다. 예를 들어 로그인한 사용자의 로그아웃 처리가 용이하다.
- 서버에서 클라이언트의 정보를 관리하기 때문에 안전하다.
단점
- 서버는 클라이언트의 정보를 메모리나 데이터베이스에서 관리하므로 부하가 심해질 수 있다
- 서비스가 커지면 스케일 아웃과 로드 밸런싱을 통한 확장이 이루어지는데, 이때 세션 관리가 번거로워진다.
- 세션 아이디가 저장되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있어 CORS를 사용하기 어렵다.
Session Cluster
세션 기반 인증의 문제점인 서버 메모리 부하 문제와 다중 서버의 세션 관리 문제를 해결하기 위해 세션을 별도의 외부 스토리지에 저장하는 개념이다. 외부 스토리지는 조회 속도를 위해 보통 In-Memory 데이터베이스(ex: Redis)를 많이 사용한다.
세션을 저장하기 위한 별도의 외부 저장소가 필요하기 때문에 관리 포인트가 증가하고, 저장소에 장애 발생 시 서비스 전체에 대규모 장애가 발생할 수 있다.
토큰 기반 인증
토큰 기반 인증 시스템은 로그인한 사용자들에게 토큰을 발급하고 서버는 사용자들이 요청 시 헤더에 토큰을 담아 요청 하도록 한다. 그리고 서버는 매 요청마다 토큰에 대한 유효성을 검사한다. 토큰 기반 인증은 기본적으로 클라언트의 정보를 서버에 저장하지 않는다. 토큰에 유효 시간과 같은 정보를 담아서 유효성 검사를 하게된다.
대표적으로 사용되는 토큰 기반 인증 시스템은 Json Web Token(JWT)이다.
장점
토큰 기반 인증 시스템은 Stateless 하기 때문에 서버의 확장에 용이하다. 어떠한 서버에 요청이 들어와도 토큰에 대한 유효성 검사만 일관적으로 수행하면 된다.
헤더에 토큰을 담아 요청하면 CORS를 쉽게 사용할 수 있다.
단점
클라이언트에 토큰 정보가 저장되기 떄문에 보안에 취약할 수 있다. XSS와 같이 자바스크립트 코드를 주입하는 공격으로 인해 저장된 토큰 정보를 조작할 수 있다. 따라서 토큰에 민감 정보를 담으면 안된다.
토큰에 너무 많은 정보를 담으면 HTTP 요청의 성능을 저하시킬 수 있다.
클라이언트의 정보를 저장하지 않기 때문에 로그아웃 같은 기능을 구현하기 어렵다
'Backend' 카테고리의 다른 글
Apache HTTP Server와 Nginx (0) | 2022.05.02 |
---|---|
[Server] JWT 알아보기 (0) | 2022.01.13 |
[Spring] CORS 설정하기 (0) | 2022.01.05 |
[Spring] Spring MVC - @JsonProperty, @JsonNaming 알아보기 (0) | 2021.11.16 |
[Spring] Spring MVC - @RequestParam, @ModelAttribute, @RequestBody (0) | 2021.10.14 |