로그인과 사용자 인증 관련 단골 용어인 세션, 쿠키, 토큰, JWT에 대해서 정리해 보고자 한다.
이 용어들을 정리하기 전에 로그인과 사용자 인증에 대해서 먼저 얘기해보자.
사용자 인증?
사용자 인증은 쉽게 말해 '이 요청을 보낸 사람이 누구인지 확인하는 과정'이다. 크게 나눠 설명해 보자면 '로그인 인증'과 '지속 인증'으로 나눌 수 있을 거 같다.
평상시에 어떤 서비스를 이용하기 위해 로그인 할 때를 생각해보자. 우리는 처음에 어떤 페이지에 들어가서 아이디와 패스워드를 입력하는 '로그인 인증'을 한다. 이는 사용자가 아이디와 비밀번호를 입력했을때 가입이 되어있는 사용자인지 확인하는 과정이다. 여기까지는 누구나 알고 있을 것이다. 하지만 사용자를 인증하는 과정은 여기서 끝이 아니다. 로그인을 하고 나서 여러 서비스를 이용할때마다 우리는 모르게 뒤에서 지속적으로 사용자 인증을 하고 있다. 내가 올바른 사용자인지 말이다.
이걸 처음 듣는 사람은 '지속적인 인증이 왜 필요하지? 로그인만 하면 끝 아닌가?'라고 생각할 수 있을 거 같다. 하지만 서버는 로그인 후에도 이 사용자가 올바른 사용자인지 알아야한다. 회사나 직장으로 비유를 해보자면 사용자가 로그인하는 것은 마치 회사 입구에서 사원증을 찍고 들어가는 것과 같다. 그리고 직장 내에서 사원증을 목에 걸고 다니거나, 직원복을 입고 다니면서 직원임을 인증하는 것을 지속 인증이라고 생각하면 쉬울 것이다.
세션 vs 토큰
대표적인 지속 인증 방법으로는 세션 인증 방식과 토큰 인증 방식이 있다.
세션 인증 방식
세션 인증 방식으로 로그인 하는 흐름을 먼저 보자.
| 화면에서 ID/PW 입력 ➡️ 서버에서 ID/PW 확인하고 유효하면 세션을 생성하고 세션을 가지고 있음 ➡️ 서버에서 세션 id만 쿠키에 담아서 화면에 전달 ➡️ 화면에서 클라이언트는 매 요청마다 요청과 함께 쿠키를 보냄 ➡️ 서버는 쿠키에서 세션 id가 유효한지 판단하고 요청을 처리 |
흐름에서 볼 수 있듯이 세션 인증 방식은 서버가 로그인 상태를 기억하는 방식이다. 서버가 실제 사용자 정보를 안전하게 관리할 수 있다는 장점이 있지만, 서버가 세션을 계속 저장해야 하므로 확장성이 떨어진다. 보통 사용자가 장시간 자리를 비운다면 세션이 만료되면서 자동 로그아웃이 되는 것도 세션 인증 방식을 사용중이기 때문이다.
토큰 인증 방식
토큰 인증 방식도 흐름을 먼저 보자.
| 화면에서 ID/PW 입력 ➡️ 서버에서 ID/PW 확인하고 유효하면 토큰을 만들어서 화면에 전달 ➡️ 화면에서 클라이언트는 매 요청마다 헤더에 해당 토큰 정보를 담아서 보냄 ➡️ 서버는 토큰이 유효한지 확인하고 요청을 처리 |
이와 같이 토큰 인증 방식은 서버가 로그인 상태를 기억하지 않고, 클라이언트가 인증 정보를 들고 다니는 방식이다. 서버가 상태를 저장하지 않아도 되기 때문에 확장성이 좋다는 장점이 있지만, 토큰은 만료 시간이 되기 전까진 유효하기 때문에 중간에 누군가가 탈취해도 무효화 시킬 수 없고 로그아웃 처리도 어렵다는 단점이 있다.
좀 더 설명을 덧붙이자면, 세션 인증 방식에서는 서버에서 세션을 저장하기 때문에 서버에서 세션을 삭제해 버리면 누군가가 세션 id를 가지고 요청을 해도 더 이상 서비스를 이용할 수 없다. 또한 'session.invalidate();'와 같은 방법으로 즉시 로그아웃도 가능하지만, 토큰 인증 방식은 로그인 정보를 서버에서 따로 저장하지 않기 때문에 이러한 것들이 불가능하다.
쿠키, JWT
쿠키(Cookie)
쿠키는 위에서 언급을 한 번 했지만, 정의하자면 브라우저에 저장되는 작은 데이터(key - value)다. 주로 서버가 브라우저에 식별자(ex. 세션 id)나 설정을 저장할 때 사용되고, HTTP 요청마다 자동으로 전송된다.
JWT
JWT는 JSON Web Token의 약자로 토큰의 구체적 포맷 중 하나다. JWT는 다음과 같이 세 부분으로 구성된다.
| 예: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJ1c2VyMTIzIn0.abc123signature
|
서버에서는 JWT api를 사용해 토큰을 만들고, 들어온 토큰이 유효한 토큰인지 확인하는 식으로 사용자 인증 처리를 한다.
정리
간략하게 사용자 인증과 관련 용어들에 대해서 알아봤다. 관련 용어들을 한 줄 정리하면서 이번 글을 마무리 한다.
- 세션(session): 서버가 관리하는 사용자 상태 저장소. 보통 세션ID만 쿠키로 브라우저에 두고, 실제 사용자 상태(로그인 정보 등)는 서버에 저장.
- 토큰(token): 인증을 위해 발급되는 문자열(=자격증명). 서버가 상태를 들고있을 수도 있고(세션 기반 토큰), 클라이언트에 자체적으로 정보를 담을 수도 있음(예: JWT).
- 쿠키(cookie): 브라우저에 저장되는 작은 데이터(키-값). 주로 서버가 브라우저에 식별자(예: 세션ID)나 설정을 저장할 때 사용. HTTP 요청마다 자동으로 전송됨(도메인/경로 일치 시).
- JWT(JSON Web Token): 토큰의 구체적 포맷 중 하나. 헤더.페이로드.서명 구조로, 페이로드에 클레임(사용자ID, 만료시간 등)을 담아 서명해서 변조 여부 검증 가능. 기본적으로 암호화하지는 않음(인증/무결성 보장, 기밀성 X).
'공개 글' 카테고리의 다른 글
| Servlet & Dispatcher-Servlet(서블릿 & 디스패처 서블릿) (0) | 2025.11.28 |
|---|---|
| 예외 처리(Exception Handling) (2) | 2025.11.14 |
| Spring Batch(Tasklet)에서 트랜잭션 롤백(rollback)이 되지 않는 경우와 해결 방법 (1) | 2025.09.12 |
| Reflection과 Class 객체 (5) | 2025.07.31 |
| static (2) | 2025.05.02 |