개요
웹 어플리케이션에서 로그인을 구현하는 방법은 크게 쿠키, 세션을 이용하는 방법과 토큰을 이용하는 방법 2가지가 있습니다. 간단히 말하면 쿠키, 세션 방식은 서버에서 세션아이디를 기록하고 브라우저에서 쿠키를 저장하는 방법이고 토큰 방식은 토큰을 발행하여 토큰의 유효성을 검증하는 방법입니다.
쿠키, 세션 (cookie, session)
사용자(클라이언트)가 서버에 자원을 요청 시 서버에서 사용자를 특정할 수 있는 데이터를 기반으로 세션 아이디를 생성하고, 해당 아이디를 키값으로 하여 필요한 값들을 서버의 메모리에 저장하고, HTTP 프로토콜의 header의 setCookie를 통해서 브라우저의 쿠키에 세션 아이디를 기록하도록 합니다.
브라우저는 request 요청을 보낼 시 header에 cookie를 자동으로 포함하여 보내게 되고(cors일 경우 credentials 등 세팅이 필요) 서버에서는 cookie의 세션 아이디를 토대로 사용자의 로그인 등을 판별할 수 있게 됩니다.
장점
- 토큰 방식은 토큰 안에 사용자에 대한 정보를 함께 넣기 때문에 세션 아이디만 전달하는 방식은 전송되는 데이터의 양이 토방 방식보다 적을 가능성이 높습니다.
- 사용자의 데이터를 서버에서 관리하기 때문에 사용자의 데이터가 토큰에 담겨있는 것보다 안전합니다.
단점
- 서버의 성능을 늘리는 방식을 scale-out으로 할 경우 각 서버의 세션을 동기화 해야하는 비용이 추가적으로 발생 할 수 있습니다.
- 사용자의 데이터를 서버의 메모리에 저장하기 때문에 메모리 용량에 대한 리스크가 있을 수 있습니다.
scale-out, scale-up
scale-out에 대해 간단히 설명하자면 서버의 성능을 물리적으로 올리는 방법 중 하나 입니다. 서버의 성능을 올리는 방법은 크게scale-out과 scale-up으로 나눌 수 있습니다.
위 그림처럼 scale-out은 서버의 갯수를 늘려서 성능을 올리는 방법이고, scale-up은 서버 자체의 성능(디스크의 용량 등)을 올리는 방법입니다. 따라서 세션 방식의 경우 서버의 메모리에 의존적이기 때문에 서버의 갯수를 늘리는 scale-out방식으로 성능을 올릴 경우 세션에 대한 데이터를 어떻게 공유시킬 건지에 대한 고민도 필요합니다.
토큰 방식 (token, JWT)
사용자가 로그인을 요청 시 서버에서는 어떠한 데이터를 기반으로 인증이 가능한 토큰을 만들어서 클라이언트에 전달하는 방식입니다. 클라이언트는 요청 시 토큰을 서버로 보내고 서버는 토큰에 대한 유효성을 검사하여 사용자가 인증되었는지 판별합니다.
토큰방식은 토큰의 유효성을 확인 할 수만 있다면 유저의 인증을 별도로 분리할 수 있습니다. 예로 구글 로그인을 통해서 구글에서 발급한 토큰을 구글의 토큰 인증 서버를 통해 유효성을 검증하여 사용자를 인증할 수 있습니다.
JWT토큰은 토큰에 대한 인증을 토큰 자체를 통해서도 가능하게 하여 토큰의 유효성을 확인하기 위해 별도의 인증 서버를 통하지 않고도 JWT토큰을 해석하여 인증 여부를 확인 할 수 있게 만들었습니다.
장점
- 사용자의 인증을 토큰을 통해서 관리하기 때문에 서버의 scale-out에서도 인증이 자유롭습니다.
- 사용자에 대한 인증 방식의 확장이 가능합니다. (facebook, google 등 소셜 로그인)
단점
- 인증된 토큰을 발급을 하면 토큰이 expire되기 전까지 토큰의 유효성을 막을 방법이 없습니다.
- 사용자를 block을 시켜야 할 때 세션방식은 세션 아이디를 파기하여 즉시 block할 수 있지만, 토큰방식은 발급한 토큰이 expire 되기 전까지 사용자에 대한 인증이 유효할 수 있습니다.
'개발 > WEB' 카테고리의 다른 글
디바운싱과 쓰로틀링 (0) | 2024.06.20 |
---|---|
12가지 API 보안 강화 전략 (0) | 2024.05.07 |
OAuth란? (0) | 2024.05.02 |
SSE(Server-Sent-Events) (0) | 2024.04.15 |
SSL/TLS 인증 (0) | 2024.04.11 |