HTTP 프로토콜의 비연결성, 무상태 특징에 따라 인증이 필요하다.
서버는 클라이언트를 기억하지 못한다. 따라서 서버에게 클라이언트가 누구인지를 계속 기억시켜줘야 한다.
이것을 인증이라고 한다.
Cookie
- 서버가 사용자의 웹 브라우저(client)에 저장하는 데이터이다.
- 쿠키의 형태는 Key:Value의 String 형식으로 이루어져 있다.
- 이름, 값, 만료일, 경로 정보로 구성된다.
- 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키는 4kb까지 저장 가능하다.
쿠키가 있으면 다른 페이지로 이동할 떄마다 로그인을 계속 하지 않고 사용자 정보를 유지할 수 있다.
1. 클라이언트가 페이지를 요청
2. 웹 서버는 쿠키 생성
3. 생성한 쿠키에 정보를 담은 후 요청한 정보와 같이 클라이언트에게 보낸다.
4. 넘겨받은 쿠키는 로컬 pc에 저장하다가 다시 서버에 요청 시 함꼐 헤더에 담아 보낸다.
5. 동일 사이트 재방문 시 클라이언트의 PC 에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송한다.
쿠키의 종류에는 2가지가 있다.
쿠키 종류
- 영속 쿠키 (Session Cookie)
- 만료 날짜를 입력하면 해당 날짜까지 유지
- 사용자 설정, 환경 등을 저장하는데 사용한다.
- 세션 쿠키 (Persistent Cookie)
- 만료 날짜를 생략하면 브라우저 종료시 까지만 유지
- 인증 정보 등의 임시 데이터를 저장하는데 사용한다.
- 서버에서는 HTTP Response Header에 Set-Cookie 속성을 이용해 클라이언트에 쿠키를 제공해 저장하게 하고, 클라이언트는 HTTP Request에 저장된 쿠키를 함께 전달하여 이전의 통신에서 사용된 정보들을 파악할 수 있다.
Session
사용자가 브라우저를 통해 웹 서버에 접속한 시점부터 종료하는 시점까지 일련의 요청들을 하나의 상태로 보고,
그 상태를 일정하게 유지시키는 기술이다.
즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.
- 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
- 브라우저를 닫거나, 서버에서 세션을 삭제했을때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
- 저장 데이에 제한이 없다.,
- 각 클라이언트 고유 세션 ID를 부여한다.
1. 클라이언트가 페이지를 요청한다.
2. 서버는 클라이언트마다 개별의 세션 ID를 부여한다.
3. 세션 ID를 담은 세션 쿠키와 함꼐 응답을 전송한다.
4. 클라이언트는 요청할 때마다 세션 ID 가 담긴 쿠키를 함께 전송한다.
5. 서버는 세션 ID를 확인하고 이를 통해 클라리언트 정보를 가져와 활용한다.

Token
- 세션과 달리 클라이언트에 저장된다.
- 토큰 인증 시 데이터가 들어가 있어서 토큰을 판별만 하면 된다.
1. 토큰 기반 인증시스템은 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 토큰을 부여
2. 이 토큰은 유일하며 토큰을 발급받은 클라이언트는 다시 서버에 요청을 보낼 때 요청 헤더에 토큰을 심어서 보낸다.
3. 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과의 일치 여부를 체크하여 인증 과정을 처리하게 된다.
JWT( JSON Web Token)
- 유저를 인증하고 식별하기 위한 토큰 기반 인증이다.
- 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다.
- RESTful과 같은 무상태 환경에서 사용자 데이터를 주고받을 수 있게 된다.
- 세션을 사용하게 될 경우 쿠키를 통해 사용자를 식별하고 서버에 세션을 저장했지만, 토큰을 클라이언트에 저장하고 요청시 HTTP 헤더에 토큰을 첨부하는 것만으로도 단순하게 데이터를 요청하고 응답받을 수 있다.
JWT는 header, payload, signature 세 파트로 나누어진다.
<header>
- kid : 서명 시 사용하는 키(Public/Private Key)를 식별하는 값
- typ : 토큰 유형
- alg : 서명 암호화 알고리즘 HS256(HMAC SHA-256), HS512, RS256(RSASSA SHA-256), ES256(ECDSA P-256 curve SHA-256)
<payload>
- iss : 토큰 발급자(issuer) – Public Claims
- sub : 토큰 제목(subject) – Public Claims
- iat : 토큰 발급 시간(issued at) – Public Claims
- exp : 토큰 만료 시간(expiration) – Public Claims
- roles : 권한 – Private Cliams
<signature>
- Header(헤더)+ 페이로드(Payload)와 서버가 갖고 있는 유일한 key 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화한다.
'spring & java' 카테고리의 다른 글
| 스프링 시큐티리 + JWT 를 이용한 로그인 처리 (2) | 2025.08.03 |
|---|---|
| Spring Event를 이용한 비동기 이벤트 처리 (0) | 2025.02.23 |
| JPA 영속성 컨텍스트 / 영속성 전이 (0) | 2024.08.13 |
| HTTP method (2) | 2024.08.11 |
| 스프링 MVC / 기본 애노테이션 정리 (0) | 2024.07.08 |