인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

博客园 - 锐洋智能

Eclipse IDE for Enterprise Find/Replace 窗口可以"停驻" 安装 SDelete 方式 SDelete 的核心作用,不是 “删文件”,而是 “把你已经删掉的文件,彻底从磁盘上抹干净”,同时帮你把虚拟机里的 “空闲空间” 变成连续的、可被回收的状态。 windows 10 启动就运行了一个批处理文件 在什么地方修改?启动项中? 让 Spring Framework7.0.7 支持 velocity Java 9+ 开启了模块化安全限制,不允许 Ignite 直接访问底层内存地址,导致 Ignite 启动失败 Spring 5.x + 老项目的 JWT 拦截器 + 自动续期 下是针对 RedisSessionManager 的 Tomcat context.xml 配置示例,覆盖基础单机 Redis、带密码 / 指定库、Redis 哨兵集群、自定义序列化 / 持久化策略 等常见场景 Redis-8.6.3-Windows-x64-cygwin 与 Redis-8.6.3-Windows-x64-msys2 有什么不一样? commons-fileupload2 M4 升级 M5 报错解决方案 阿里云的网络安全策略 ip 地址详细说明 Paralithic、 QLExpress、AviatorScript、exp4j 性能对比一下 java 序列化影响(重要!) paralithic 与 Aviator 表达式那一个更快 券商接受委托的完整时间线 jQuery 4.0 移除了许多已废弃的方法和特性 xheditor插件无限递归错误解决方法 jedis-7.1.0.jar 升级至 jedis-7.2.0.jar 就提示:The type JedisPoolConfig is deprecated The type JedisPooled is deprecated Spring 从 5.x 到 6.x 和 7.x 区别 js 原生 剪切板 复制功能 安装 Microsoft Visual C++ 运行时 Java与Python进程通信优化方案 Autocomplete | jQuery UI 同一面页定义不同的 .ui-autocomplete Quartz的misfire处理策略设置不当导致Job在应用启动时立即执行。 mysql-connector-j-9.5.0.jar BUG 推荐几款好用的CSS在线压缩工具 CSS 变量 定义及引用 TLS virtual host [_default_], certificate type [RSA] configured from keystore [d:/reyo/jks/localhost.jks] using alias [tomcat] with trust store [null] okhttp5.x 需要在 请求级别 控制是否使用重试拦截器,而不是在客户端级别 Apache Commons FileUpload 1.x 与 2.x 的主要区别
인터페이스 인증: 세션/쿠키와 JWT의 핵심 차이점
锐洋智能 · 2026-05-27 · via 博客园 - 锐洋智能

인터페이스 인증: 세션/Cookie와 JWT의 핵심 차이점

너가 말하는 것이 정확합니다:전통적인 웹 프로젝트에서는 세션/Cookie를 사용하지만, 프론트엔드와 백엔드가 분리된 인터페이스 프로젝트(RESTful API)에서는 반드시 JWT를 사용해야 합니다 이 핵심 이유는아키텍처가 변화했기 때문입니다— 전통적으로는서버가 페이지를 렌더링했습니다하지만 지금은프론트엔드가 독립적이고 인터페이스는 상태가 없습니다.

나는 가장 일반적이고 핵심적인 방식으로, 두 가지의 차이점을 명확하게 설명하겠습니다:


1. 먼저 이해해야 할 것: 전통적인 인터페이스는 왜 세션을 사용할 수 없는가?

세션의 작동 원리(상태 유지)

  1. 브라우저 로그인 → 서버 세션 생성 및 메모리/데이터베이스에 저장
  2. 서버는 SessionID 쿠키에 존재 정보를 포함하여 반환
  3. 다음 요청 → 브라우저가 자동으로 쿠키를 포함하여 전송 → 서버는 세션을 조회하여 사용자 확인

2. 세션의 치명적인 단점(인터페이스에 적합하지 않음)

  • 강력한 쿠키 의존성 : 크로스 도메인, 웹소켓, 앱, 제3자 호출에 제한
  • 서버는 상태를 저장해야 합니다:분산 / 다중 서버에서 세션 공유(리덕스 동기화)를 하려면
  • 전후단 분리가 불편합니다:프론트엔드는 순수 클라이언트이며 브라우저가 자동으로 쿠키를 포함하지 않습니다

따라서:인터페이스 인증은 서버 측 상태 저장 방식을 버려야 합니다 → JWT가 등장합니다


이 두, JWT는 무상태인가요

JWT = JSON Web Token

한마디로 말하면: 사용자 식별 정보를 암호화하여 문자열로 만들어 클라이언트에 저장하고, 서버는 로그인 상태를 저장하지 않습니다

작업 흐름:

  1. 로그인 성공 → 서버가 키를 사용하여 JWT를 발행합니다(아무 데이터도 저장하지 않음)
  2. 프론트엔드는 JWT를 로컬에 저장(로컬 스토리지 / 웹소켓 캐시)합니다
  3. 각 요청 시 인터페이스 → 프론트엔드 JWT를 수동으로 요청 헤더에 추가합니다
  4. 서버 엔드 키만으로 JWT의 유효성을 검증하고, 데이터베이스를 확인하지 않습니다

세션 / 쿠키와 JWT의 핵심 차이점(표를 보고 이해하기)

비교 차원 세션 / 쿠키 JWT
저장 위치 서버 측 저장, 클라이언트는 ID만 저장 모두 클라이언트에 존재 서버는 저장하지 않음
상태 상태적(서버는 세션을 조회해야 함) 상태 없음(Stateless, 인터페이스는 자연스럽게 분산 지원)
교차 도메인 / 교차 단말기 부족(Cookie에 의존, 교차 도메인 제한 큼) 매우 뛰어남(Web, 웹소켓, 앱, 제3자 인터페이스 지원)
분산 배포 복잡(세션 공유 필요) 극히 간단(여러 서버가 동일한 키로 검증)
요청 방식 브라우저가 자동으로 Cookie를 포함 프론트엔드수동 전송(요청 헤더 / 파라미터)
보안 특징 CSRF 공격에 취약 CSRF 위험 없음
적용 시나리오 傳統 웹사이트、서버 측 렌더링 프론트엔드와 백엔드 분리、RESTful API、미들웨어 서비스

4. 가장 중요한 3가지 본질적인 차이점

1. 상태가 없음(가장 핵심적임)

  • 세션서버는 로그인했음을 기억해야 합니다(상태적)
  • JWT서버는 아무도 기억하지 않으며, 토큰만 인식합니다(무상태)인터페이스 아키텍처는 상태가 없어야 하므로 JWT는 표준입니다

2. 데이터는 어디에 있습니까

  • 세션:서버에 존재합니다
  • JWT: 존재합니다클라이언트가 자신의 손안에

3. 확장성

  • 세션:서버가 많을수록 복잡해진다
  • JWT:서버를 임의로 추가하고 코드를 수정할 필요 없습니다

5. 간단한 요약: 왜 인터페이스에 JWT를 사용해야 하는가요?

  1. Cookie에 의존하지 않습니다가로질기, 웹소켓, 앱 전부 지원합니다
  2. 서버는 로그인 상태를 저장하지 않습니다따라서 분산/클러스터링을 자유롭게 확장할 수 있습니다
  3. 표준적이고 일반적입니다모든 전후端 분리 아키텍처에서 사용됩니다
  4. 보안이 가능하고 통제 가능합니다만료 설정, 암호화, 변경 방지 기능이 있습니다

요약

  • Session/Cookie: 전통적인 웹사이트에 적합하며, 서버는 상태를 저장하고 브라우저에 의존합니다
  • JWT인터페이스 인증에 적합하며, 상태 없음, 크로스엔드, 분산형 친화적

간단히 기억해두세요:

웹사이트는 Session을 사용하고, 인터페이스는 JWT를 사용하세요; 상태가 있으면 Session을 사용하고, 상태가 없으면 JWT를 사용하세요.

<!-- JWT 工具:jjwt,Spring5 兼容 -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.5</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.5</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.5</version>
    <scope>runtime</scope>
</dependency>