웹 애플리케이션에서 사용자의 인증을 처리하는 방식은 크게 세션 방식과 토큰 방식으로 나뉜다. 두 방식의 차이점과 각각의 장단점을 글로 정리해볼겸 알아보자. 알거같으면서도 말로 내뱉지 못하는.. 제대로 설명해보자구 @!!@!@
구분 | 인증 (Authentication) | 인가 (Authorization) |
---|---|---|
목적 | 사용자의 신원 확인 | 사용자의 권한 부여 |
주요 개념 | "너 누구야?" → 사용자가 누구인지 확인 | "너 할 수 있어?" → 사용자가 무엇을 할 수 있는지 확인 |
예시 | 로그인 (ID와 비밀번호 확인) | 관리자 권한 확인, 특정 페이지 접근 권한 |
인증과 인가에 대한 개념 차이는 무조건 자동으로 나와야겠지??????? 음음 그럼 .
세션과 토큰의 차이는 상태 관리 방식에서도 나타난다.
구분 | Stateless (토큰) | Stateful (세션) |
---|---|---|
서버 상태 | 서버는 상태를 저장하지 않음 | 서버가 사용자의 상태(Session)를 저장 |
확장성 | 확장성 뛰어남 (여러 서버 간 공유 필요 없음) | 서버 간 세션 공유가 필요하므로 확장성 낮음 |
사용 사례 | REST API, 마이크로서비스 구조 | 단일 서버 기반의 시스템 |
여기서 HttpOnly에 토큰을 담는 것과 서버 상태 저장은 별개의 개념이라는것을 알아두자 잠깐 헷갈렸어요 .. 나만 그랬을 수도 ;; 열심히 공부하겠습니다...
Stateless는 서버가 클라이언트의 상태를 저장하지 않는다는 의미이다.
HttpOnly 쿠키에 토큰을 저장하는 것은 토큰 저장 방식 중 하나일 뿐 !!
자자 이제 다시 정리하려는걸로 넘어와서 !!!!!!!!!!!!!!!!!!!!
로그인을 하면 서버가 유저에게 입장권을 하나 발급해주는데,
이 입장권은 서버가 유저를 식별하는 수단이라고 생각하면 된다.
세션 방식
: 입장권에 발급 번호만 존재 토큰 방식
: 입장권에 사용자 관련 정보가 포함됨세션 방식은 서버가 세션 저장소(Session Store) 에 로그인한 사용자의 정보를 저장하고 관리하는 방식이다.
토큰 정보
: 세션 ID만 존재 → 사용자 정보는 서버 세션 저장소에 별도로 저장 서버 부담
: 사용자가 많아질수록 서버에 저장된 세션을 일일이 확인해야 하므로 서버 부하가 커질 수 있음보안
: 세션은 서버에 저장되므로 유출될 가능성이 낮음확장성
: 서버가 늘어날 때 세션 데이터를 공유해야 하므로 확장성이 떨어질 수 있음토큰 방식은 로그인 후 서버가 발급하는 토큰(Token)에 사용자의 정보를 담아서 인증하는 방식이다.
토큰 정보
: 사용자 정보(이름, 이메일, 유효기간 등)가 토큰에 포함됨 서버 부담
: 세션 저장소가 필요하지 않으므로 서버의 부담이 줄어듦 확장성
: 서버 간 상태를 공유하지 않아도 되므로 확장성이 뛰어남 보안
: 토큰이 유출되면 사용자 정보를 확인할 수 있으므로 주의가 필요함구분 | 세션 방식 | 토큰 방식 |
---|---|---|
저장 위치 | 서버 세션 저장소 | 클라이언트 (로컬 스토리지, 쿠키 등) |
정보 포함 | 세션 ID만 포함 (사용자 정보는 서버에 저장) | 사용자 정보와 만료 기간 등이 포함된 토큰 |
서버 부하 | 세션 저장소에 접근해야 하므로 부하가 클 수 있음. | 토큰만 검증하면 되므로 서버 부하가 적음 |
확장성 | 서버 간 세션 공유 필요 → 확장성 낮음 | 서버 상태를 공유할 필요 없음 → 확장성 뛰어남 |
보안 | 세션은 서버에 저장되므로 상대적으로 안전함. | 토큰 유출 시 사용자 정보 노출 가능 → 주의 필요 |
유효기간 관리 | 세션 저장소에서 만료 시간 관리 | 토큰 자체에 유효 기간이 포함됨 |
세션 방식
: 서버가 중앙에서 인증을 관리해야 하고 보안이 중요한 경우에 적합하다.
(예: 보안이 중요한 사내 시스템, 인트라넷 등)
토큰 방식
: 확장성이 중요하고 분산된 서버 환경에서 빠르게 인증을 처리해야 하는 경우에 적합하다.
(예: 모바일 앱, REST API 기반 서비스 등)
세션 방식
은 서버가 사용자 정보를 직접 관리하며 안정적이지만, 서버 부하가 발생할 수 있다. 토큰 방식
은 JWT 토큰에 사용자 정보를 담아 서버 부담을 줄이고 확장성을 높일 수 있다. 여기서???????????? 로그인 인증에 관련된 개념을 보완하고 더 확장하기 위해 몇 가지 추가 개념과 키워드를 정리해보자.
쿠키는
웹 브라우저에 저장되는 작은 데이터 조각
이다.
웹 서버가 사용자의 브라우저에 데이터를 저장하면, 이후 요청 시 그 데이터를 서버로 다시 보내어 사용자의 상태를 유지하거나 특정 정보를 기억하는 데 사용된다.
구분 | 쿠키 | 세션 |
---|---|---|
저장 위치 | 클라이언트 (브라우저의 쿠키 저장소) | 서버 세션 저장소 (세션 ID만 클라이언트로 전송) |
데이터 | 키-값 형태의 데이터를 저장 | 서버에 저장하고 클라이언트에 세션 ID만 전달 |
유효 기간 | 브라우저 종료 시 삭제 or 만료 기간 설정 가능 | 설정한 시간 또는 브라우저 종료 시까지 유지 |
보안 | 클라이언트에 저장되므로 보안이 상대적으로 약함 | 서버에 저장되므로 비교적 안전하지만 세션 ID 노출 시 위험 |
용도 | 로그인 상태 유지, 사용자 설정 값 유지 등 | 사용자 인증 및 상태 관리 |
💡 쿠키를 기반으로 세션 ID를 저장하면 세션이 작동하며, 세션과 쿠키는 함께 사용되기도 한다.
토큰 방식에서 보안을 강화하기 위한 몇 가지 개념:
Refresh Token
토큰 저장소
다음 벨로그는 HttpOnly 활용하는걸 정리해볼건데 뭣도모르고 하면 망할수도있다. 조심하자..
토큰 서명
외부 서비스의 계정을 사용하여 로그인을 처리하는 소셜 로그인에 주로 사용된다.
(예: 구글, 페이스북, 카카오 로그인)
보안을 강화하기 위해 2단계 인증 또는 다중 인증 방식을 도입하는 경우가 많다.
예시: 구글 OTP, 카카오페이 인증
로그인 인증 방식에는 세션 방식과 토큰 방식이 있으며, 각각의 특징과 보안 요구사항에 맞게 선택해야 한다. 또한, OAuth, JWT, Refresh Token 등 다양한 개념을 함께 적용하면 확장성과 보안을 모두 만족할 수 있다.
추가로 MFA를 통해 보안을 강화하고, Stateless 구조로 인증 서버를 설계하면 확장성 있는 시스템 구축이 가능하다.
🚩 세션 vs 토큰 핵심 요약
- 세션: 서버가 상태 관리 → Stateful, 서버 부담 높음, 보안 강점
- 토큰: 클라이언트에 상태 저장 → Stateless, 확장성 뛰어남, 유출 위험 주의