Session VS JWT
🌱인증과 인가
- 인증
- 인증은 말 그대로 사용자의 신원을 확인하는 것으로, 특정 인증 요청(로그인, 이메일 인증 등)이 유효한 사용자인지를 검증하는 과정이다.
- 만약 인증 과정이 없다면 어떻게 될까?
인증되지 않은 사용자가 마음대로 상품 정보를 수정하고 주문하는 등 악의적인 행동을 할 수 있을 것이다.
그래서 인증 절차를 통해 서버가 인증된 사용자를 검증하는 과정이 필요하다.
- 인가
- 인가는 이미 인증된 사용자에게 특정 자원에 대한 접근 권한을 부여하는 과정이다.
- 예를 들어 일반 사용자 "USER"와 관리자 "ADMIN"이 있다고 가정해보자.
USER는 ADMIN에 접근 할 수 없어야하고 ADMIN은 USER보다 더 많은 정보에 접근할 수 있다.
즉, 특정 사용자가 접근 할 수 있는 범위를 정하는 것이다.
- HTTP의 stateless와 connectionless
- stateless → 상태가 없는 == 데이터가 없다는 것, connectionless → 비연결성의
- HTTP의 요청들은 서로 독립적이라는 뜻
- 로그인 == 상태(데이터)를 가지고 있다.

-
JWT → 클라이언트에서는 JWT(유저정보)를 갖고 있고 이를 HTTP 요청마다 같이 보내서 항상 자신이 누구인지를 알려서 HTTP 요청들 간의 독립성을 극복하고,
-
Session → 서버에서는 서버에 Session(유저정보)를 갖고 있고, 클라이언트는 Session Key(랜덤하고 무의미한 값)를 갖고 이를 HTTP 요청마다 같이 보내서 HTTP 요청들 간의 독립성을 극복하는 것입니다.
🌱 세션(Session)
세션이란?
- 세션은 민간함 정보가 브라우저(클라이언트)에 저장되는 쿠키의 보안적 이슈를 해결하기 위해 나온 방식이다.
- 세션은 비밀번호 같이 민감한 정보를 브라우저가 아닌 서버에 저장하고 관리한다.
- 세션 저장 시에는 세션 불일치 문제를 해결하기 위해 메모리(Redis)나 데이터베이스(JDBC) 저장한다.
인증방식
- 사용자(클라이언트)가 서버에 로그인 요청
- 서버는 인증 절차를 수행하고, 인증이 유효하면 세션 객체를 생성하고 서버에 저장한다.
- 서버는 요청에 대한 응답으로 응답헤더의 set-cookie를 통해 Session Id를 클라이언트에게 전달한다.
- 이후부터는 클라이언트가 서버에 요청할 때 마다 전달받은 쿠키를 요청헤더에 추가하여 요청한다. (쿠키를 요청헤더에 추가해주는 것은 브라우저가 처리해준다.
세션 방식의 한계
- 세션 방식은 사용자의 인증 정보를 서버에 저장하기 때문에, 많은 사용자를 갖고 있는 서비스의 경우에는 서버에 부하를 줄 수 있다. (서버가 클라이언트 상태를 저장해 때문에
stateful한 방식)
- 만약 세션 저장소로 Redis를 사용할 경우에는 메모리 부족 문제가 발생할 수도 있고, DB에 저장할 경우에는 잦은 I/O로 인해 DB에 큰 부담을 줄 것 이다.
- 서버가 사용자의 상태를 저장하고 있어야 하는 것은 상당히 부담스러울 것이다.
- 바로 이러한 한계들을 극복하기 위해 나온 것이 바로 토큰 방식인 JWT이다.
🌱 JWT(Json Web Token)
토큰이란?
- 사용자(클라이언트)가 서버에 인증 요청을 보내면 서버에는 인증 절차를 수행하고 유효한 사용자면 인증되었다는 "토큰"을 부여한다.
- 이 토큰은 유일하며 토큰을 발급받은 클라이언트는 서버에 요청을 보낼 때 마다 요청 헤더에 토큰을 담아 보내고, 서버는 제공한 토큰과 사용자의 토큰이 일치 여부를 체크 한다.
- 인증 정보가 서버에 저장되는 세션과 달리 토큰은 클라이언트에 저장된다.
즉, 서버가 클라이언트 상태를 서버가 저장하지 않아 stateless하여, 서버의 부담을 덜 수 있다.
JWT
- 인증에 필요한 정보들을 암호화 시킨 Json 토큰

JWT 인증 방식
- 사용자(클라이언트)가 서버에 로그인 요청
- 서버는 인증 절차를 수행하고, 인증이 유효하면 Base64로 인코딩된 JWT를 클라이언트에게 발급해준다.
- 사용자(클라이언트)는 요청 시 요청 헤더의 Authoriztion에 발급 받은 JWT를 "Bearer JWT 토큰" 형식으로 담아 보낸다.
- 서버는 전달 받은 JWT를 검증하고 응답한다.JWT에는 요청한 사용자의 정보가 담겨있어 DB를 조회하지 않고 사용자를 식별할 수 있다.
장점
- 서버가 사용자의 상태를 유지할 필요가 없으므로 서버는 무상태(Stateless)가 되어 서버의 자원을 절약하고 확장성을 향상시킬 수 있고 서버는 클라이언트의 요청마다 토큰만 확인하면 된다.
- 별도의 저장소를 갖지 않아도 된다.
- 토큰을 사용하는 다른 시스템에 접근 및 권한 공유가 가능하다.
- 클라이언트가 인증 정보를 갖고 있기 때문에, 분산 시스템과 MSA에서도 유용하다.
- 세션 사용이 불가능한 모바일에서 잘 작동한다.
단점
- 많은 양의 데이터를 JWT에 저장하면 토큰 크기가 커져 네트워크 부하가 발생할 수 있다.
- PAYLOAD는 Base64로 인코딩된 것이기 디코딩도 쉬워 탈취당하면 데이터가 노출될 수 있다. 그렇기 때문에
- PAYLOAD에 민감한 정보를 담아서는 안된다.
- 클라이언트가 토큰을 저장하고 있기 때문에 토큰 자체를 탈취당하면 대처하기 어렵다.
참고
https://hstory0208.tistory.com/entry/JWT%EB%9E%80-%EC%9E%A5%EB%8B%A8%EC%A0%90%EA%B3%BC-Session-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://jhbljs92.tistory.com/entry/1-JWT-%ED%86%A0%ED%81%B0-%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-%ED%86%A0%ED%81%B0