Session VS JWT

이유진·2024년 9월 30일
0
post-thumbnail

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) 저장한다.

인증방식

  1. 사용자(클라이언트)가 서버에 로그인 요청
  2. 서버는 인증 절차를 수행하고, 인증이 유효하면 세션 객체를 생성하고 서버에 저장한다.
  3. 서버는 요청에 대한 응답으로 응답헤더의 set-cookie를 통해 Session Id를 클라이언트에게 전달한다.
  4. 이후부터는 클라이언트가 서버에 요청할 때 마다 전달받은 쿠키를 요청헤더에 추가하여 요청한다. (쿠키를 요청헤더에 추가해주는 것은 브라우저가 처리해준다.

세션 방식의 한계

  • 세션 방식은 사용자의 인증 정보를 서버에 저장하기 때문에, 많은 사용자를 갖고 있는 서비스의 경우에는 서버에 부하를 줄 수 있다. (서버가 클라이언트 상태를 저장해 때문에 stateful한 방식)
  • 만약 세션 저장소로 Redis를 사용할 경우에는 메모리 부족 문제가 발생할 수도 있고, DB에 저장할 경우에는 잦은 I/O로 인해 DB에 큰 부담을 줄 것 이다.
  • 서버가 사용자의 상태를 저장하고 있어야 하는 것은 상당히 부담스러울 것이다.
  • 바로 이러한 한계들을 극복하기 위해 나온 것이 바로 토큰 방식인 JWT이다.

🌱 JWT(Json Web Token)

토큰이란?

  • 사용자(클라이언트)가 서버에 인증 요청을 보내면 서버에는 인증 절차를 수행하고 유효한 사용자면 인증되었다는 "토큰"을 부여한다.
  • 토큰은 유일하며 토큰을 발급받은 클라이언트는 서버에 요청을 보낼 때 마다 요청 헤더에 토큰을 담아 보내고, 서버는 제공한 토큰과 사용자의 토큰이 일치 여부를 체크 한다.
  • 인증 정보가 서버에 저장되는 세션과 달리 토큰은 클라이언트에 저장된다.
    즉, 서버가 클라이언트 상태를 서버가 저장하지 않아 stateless하여, 서버의 부담을 덜 수 있다.

JWT

  • 인증에 필요한 정보들을 암호화 시킨 Json 토큰

JWT 인증 방식

  1. 사용자(클라이언트)가 서버에 로그인 요청
  2. 서버는 인증 절차를 수행하고, 인증이 유효하면 Base64로 인코딩된 JWT를 클라이언트에게 발급해준다.
  3. 사용자(클라이언트)는 요청 시 요청 헤더의 Authoriztion에 발급 받은 JWT를 "Bearer JWT 토큰" 형식으로 담아 보낸다.
  4. 서버는 전달 받은 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

profile
🙌중요한건 꺾였는데도 그냥 하는 마음

0개의 댓글