Vue 과정을 진행하면서 온전히 SPA로만 구현한 클라이언트를 위한 인증 처리의 필요성이 생겼고 이를 위해 JWT 사용법을 정리하고자 한다.
https://goodteacher.tistory.com/712
세션 관리
이번 포스트에서는 Redis를 이용한 세션 관리에 대해 살펴보자. scale up / scale out 인프라 업그레이드 열심히 프로젝트를 진행하고 결과물이 잘 서비스되는 것을 바라보는 것은 매우 흐믓한 일이다.
goodteacher.tistory.com
Session Cookie vs JWT를 통한 인증의 차이
먼저 session cookie를 이용하는 방법과 jwt를 이용한 인증 방식의 차이를 살펴보자.
Session Cookie 활용
session cookie는 전통적인 server의 인증 방식이다.
session cookie 기반의 인증
클라이언트가 id/pass를 가지고 서버로 로그인 요청을 한다.
서버는 db server를 이용해 해당 사용자가 valid한지 점검하고 결과를 반환한다.
로그인 성공 시 서버는 session store에 세션 공간을 할당하고 이 공간에 접근할 수 있도록 session cookie를 response로 내려보낸다.
작업을 요청할 때 client는 session cookie를 request에 포함시켜 서버로 전송한다.
서버는 이 cookie 값으로 로그인한 적이 있는지 session store에 확인한다.
로그인한 사용자라면 요청을 처리한다.
session cookie 방식의 핵심은 로그인 정보는 session store에 존재하고 이 정보에 접근할 수 있는 키만 cookie로 전달된다는 점이다. 따라서 실제 사용자의 정보를 확인하기 위해서는 계속 session store에 질의 해야 한다.
JWT(JSON Web Token) 활용
다음은 JWT를 이용한 인증 방식이다.
JWT를 이용한 인증
클라이언트가 id/pass를 가지고 서버로 로그인 요청을 한다.
서버는 db server를 이용해 해당 사용자가 valid한지 점검하고 결과를 반환한다.
로그인 성공 시 서버는 인증 정보가 담긴 token을 생성 후 session cookie를 response로 내려보낸다.
작업을 요청할 때 client는 token을 request에 포함시켜 서버로 전송한다.
서버는 이 token이 valid 한지 확인한다. JWT는 토큰 자체에 로그인 정보를 포함한다. 따라서 session store에 확인하지 않는다.
로그인한 사용자라면 요청을 처리한다.
두 방법 비교하기
두 방법을 비교해서 정리해보자.
항목
session cookie
Json Web Token
인증 정보의 저장 위치
서버
클라이언트
인증을 위해 클라이언트가 서버로 보내는 것
session cookie
서명된 token 자체
사용자의 요청에 대한 서버의 인증 확인
session store에 cookie에 대한 사용자의 정보가 있는지 확인(redis db query 수행 등)
token이 잘 서명되었는지만 판단
서버가 사용자의 인증 정보 수정, 로그아웃 처리 가능 여부
처리 가능(세션은 서버에서 관리)
불가(토큰은 클라이언트가 관리)
공격 가능성
쿠키 탈취에 의한 CSRF 공격
토큰 탈취, 비밀 키 유출
어떤 방법이 더 좋다기 보다는 장단점을 기억해주는 것이 좋다. 일반적으로 MPA에서는 session cookie를 많이 이용했다면 REST 방식의 서버와 통신하는 SPA에서는 JWT를 많이 이용하는 추세다.
JWT?
이 블로그에서 사용할 JWT에 관해서는 아래 블로그에 정말 잘 정리되어있으므로 시간 내서 읽어보기를 권한다.
https://velopert.com/2350
[JWT] 토큰(Token) 기반 인증에 대한 소개 | VELOPERT.LOG
소개 토큰(Token) 기반 인증은 모던 웹서비스에서 정말 많이 사용되고 있습니다. 여러분이 API 를 사용하는 웹서비스를 개발한다면, 토큰을 사용하여 유저들의 인증작업을 처리하는것이 가장 좋은 방법입니다. 토큰 기반 인증 시스템을 선택하는데에는 여러가지 이유가 있는데요, 그 중 주요 이유들은 다음과 같습니다 Stateless 서버 Stateless 서버를 이해하려면 먼저 Stateful 서버가 무엇인지 알아야합니다. Stateful 서버는 클라이언트에게
velopert.com
REST를 이용한 시스템들은 대부분 JSON을 통해 데이터만 전달한다.
Vue처럼 MicroService의 클라이언트로 동작하는 애플리케이션들은 여러 서버를 사용해야 하기 때문에 동일한 세션을 유지하기 어렵다. 이런 경우 로그인한 사용자에게만 서비스 하고 싶고 지금 접속한 사용자가 적절한 사용자인지 확인하고 싶다면 JWT를 이용한 토크 기반의 인증을 시도해볼만 하다.
JWT란?
JWT(JSON Web Token) 은 웹 표준(RFC7519)으로 대부분의 언어, 플랫폼에 독립적으로 사용할 수 있는 장점이 있다.
JWT는 헤더(header).내용(payload).서명(signature) 로 구성된다.
- header는 토큰의 타입과 해시 암호화 알고리즘으로 구성된다.
- payload는 userid, expire, scope등 정보가 담긴다.
- signature에는 secret key를 포함하며 암호화 되어있다.
JWT 동작 절차
클라이언트는 인증을 위해 ID와 password를 서버에 전달한다.
서버는 클라이언트의 정보 확인 후 인증 정보를 JWT로 클라이언트에 보낸다.
클라이언트(브라우저)는 이 정보를 저장하기 위해 storage등을 사용한다.
이후 필요한 API 호출 시 JWT를 함께 전달한다.
REST API를 제공하는 서버는 JWT가 적절한 지 검증 후 호출한 API 결과를 반환한다.
다음 포스트에서는 Spring Boot에서 JWT를 이용한 애플리케이션 서버를 생성해보자.