강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Jh P님의 프로필 이미지
Jh P

작성한 질문수

FastAPI 완벽 가이드

FastAPI의 SessionMiddleware를 이용한 Signed Cookie 다루기 - 02

signed cookie 와 jwt 토큰

작성

·

35

0

안녕하십니까 강사님! 자세하게 좋은 정보 알려주심에 항상 감사드립니다!!

제 짧은 지식으로 궁금한 점이 생겨 질문드립니다.
사용자 인증을 구현할때 jwt토큰을 사용하는 방법도 있는 걸로 압니다. jwt토큰도 마찬가지로 signed cookie처럼 암호화(인코딩)해서 헤더에 같이 보내는걸로 알고 있습니다.

두 방식이 비슷하다고 생각하는데 jwt토큰과 signed cookie로 인증하는 차이가 무엇인지 궁금합니다.


짧은 경험상 모든 기술간의 트레이드 오프가 존재했던 거 같은데 jwt토큰과 signed cookie에도 그러한 부분이 있는지 궁금합니다 !

항상 감사드립니다~

답변 2

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까, 강의 칭찬해 주셔서 감사합니다 ^^

JWT와 Signed Cookie의 가장 큰 차이는 Signed Cookie는 웹브라우저 기반에서 쿠키 정보를 인증하는 것이고, JWT는 HTTP 프로토콜을 사용하기만 하면, 어떤 클라이언트에서도 인증을 수행할 수 있는 방식 입니다.

그러니까 Signed Cookie는 웹브라우저가 필요하고, JWT는 웹브라우저 뿐만 아니라 다양한 모바일 앱, 서버 To 서버, 사이트 To 사이트, IoT 디바이스 등에서도 인증을 수행할 수 있습니다. JWT가 이렇게 다양한 클라이언트에서 사용될 수 있는 이유는 JWT가 HTTP 헤더에 실어 보내는 Json 형태의 문자열일 뿐이기 때문입니다. 서버와 클라이언트가 HTTP 프로토콜로 통신만 할 수 있으면 편리하게 인증을 적용할 수 있습니다.

JWT는 크게 3가지 요소를 가지는데, Header, Payload, Signature로 구성되어 있습니다. Payload는 주요 정보를 담고 있는데, Payload는 base64 인코딩만 적용되므로 중간에서 탈취되면 값을 확인할 수 있습니다. 그래서 JWT 자체에는 보안상 중요한 값, 예를 들어 Password, 신용카드정보, 계좌번호, 주민번호와 같은 값은 담지 않아야 되며, 주로 사용자 ID, 접근 권한, 만료 시간등의 정보를 가집니다.

그렇다고 보안을 적용하지 않는 것은 아닙니다. 바로 JWT의 Signature와 JWT를 인증하는 서버에서 Signature 발급시 적용한 secret key를 기반으로 Signature가 변조되었는지 비교하는 단계가 있습니다. Signature가 서로 맞지 않으면, 인증을 허용하지 않습니다.

JWT는 민감정보를 보관하기는 적절치 않은 단점은 있지만, HTTP 프로토콜을 사용하는 한 클라이언트 제한이 없다는 장점 때문에 API 기반의 인증이나, 카카오, 네이버, 구글등의 외부 제 3자 서비스 인증(OAuth2)에서 자주 활용됩니다.

 

감사합니다.

Jh P님의 프로필 이미지
Jh P
질문자

답변해주셔서 감사드립니다!!

죄송하지만 하나만 질문 더 드리겠습니다
특정 데이터가 자주 사용되는 경우 DB에다가 저장하지 않고 세션 쿠키로 해당 내용을 저장한다음 쓰는 방식도 많이 사용되나요?
db를 쿼리 후 데이터를 가져오는 방식과 세션에서 가져오는 방식이 장단점이 있을 거 같은데 제 생각대로 말씀드려보면

유저의 고유 데이터가 자주 사용되는 경우에

  • 필요한 데이터를 DB에서 매번 호출
    - DB작업이 일반적으로 가장 자원 소모가 크므로 i/o 병목 우려

  • 필요한 데이터를 세션쿠키에서 계속 가지고 있다가 꺼내서 씀
    - 네트워크에서 전달되는 양이 많아 로딩 속도가 느려질 수 있음

이런 고려 사항들이 있는 거 같은데 예시를 들자면 채팅 같은 경우도 채팅 내역을 DB에서 불러오자니 자주 DB를 쿼리하게됨. 그렇다고 세션 쿠키에서 저장 해놓자니 헤더의 크기가 커질 수 있음. 이런 예시가 있는 거 같습니다!

항상 부족한 질문에도 성심성의껏 답변해주심에 정말 감사드립니다!!

권 철민님의 프로필 이미지
권 철민
지식공유자

특정 데이터가 자주 사용되는 경우 DB에다가 저장하지 않고 세션 쿠키로 해당 내용을 저장한다음 쓰는 방식도 많이 사용되나요?

=> 네 맞습니다. 쿠키 자체에 주요 정보를 저장하지는 않고, 쿠키는 세션 식별자만 가지고, 서버에서 Redis같은 별도 메모리 DB(또는 서버의 세션 메모리)에 주요 정보를 저장하고 사용하는 방식을 많이 사용합니다.

다만 정보 자체는 세션 메모리를 많이 잡아 먹기 때문에 데이터가 큰 경우는 사용하지 말아야 합니다. 채팅 내역 같은 경우는 데이타가 많아서 세션으로 저장하기는 부적절 할 수 있습니다.

 

감사합니다.

Jh P님의 프로필 이미지
Jh P
질문자

친절한 답변 정말 감사드립니다!! 덕분에 학부생으로써 많이 배웁니다!!

0

안녕하세요, 인프런 AI 인턴입니다. Jh P님!

사용자 인증과 관련하여 JWT 토큰과 signed cookie의 차이점을 이해하는 데 도움이 되는 답변을 제공하려고 합니다. 두 방식은 웹 애플리케이션에서 사용자의 인증과 데이터를 안전하게 전달하는 데 사용되지만, 그 접근 방식과 장단점에서 차이가 있습니다.

JWT(토큰 방식):

  • 구조: JWT는 JSON 객체로, Header, Payload, Signature로 구성되어 있습니다. 이 토큰은 클라이언트 측에서 저장되며, 서버는 이 토큰을 통해 인증을 확인합니다.
  • 장점:
    • 탈중앙화: 서버에서 상태를 저장하지 않아도 되므로, 서버 확장이 용이합니다.
    • 독립적: 하나의 토큰이 다양한 서비스나 리소스에 접근하는 데 사용될 수 있습니다.
  • 단점:
    • 보안: 토큰이 노출되면 위험하며, 유효기간이 길 경우 보안 취약점을 노출할 가능성이 있습니다.
    • 크기: Payload에 많은 데이터를 담을 수 있지만, 이는 네트워크 비용 증가로 이어질 수 있습니다.
  • 구조: 쿠키에 서명(signature)을 부가하여, 서버에서 데이터를 검증할 수 있도록 한 방식입니다.
  • 장점:
    • 안전성: 쿠키는 기본적으로 서버와 클라이언트 간 자동으로 전달되며, 관리가 간단합니다.
    • 간편함: 서명된 쿠키는 서버마다 상태를 저장할 수 있습니다.
  • 단점:
    • 초과 요청: 매 요청마다 쿠키가 자동으로 추가되기 때문에, 네트워크 부하가 발생할 수 있습니다.
    • 상태 관리: 다중 서버 환경에서는 쿠키 기반의 상태 관리가 복잡할 수 있습니다.

트레이드 오프:

  1. 스케일링: JWT는 탈중앙화된 구조로 확장이 쉽지만, 쿠키 기반 인증은 더 많은 서버 측 상태 관리가 필요할 수 있습니다.
  2. 보안성: 두 방식 모두 보안에 관련된 고민이 필요합니다. JWT는 기하급수적인 복잡도를 증가시키는 데 반해, 쿠키는 CSRF와 같은 공격에 취약할 수 있습니다.

이 주제에 대해 추가적으로 탐구해 보시기 위해 다음과 같은 게시물을 확인해 보실 수 있습니다:
- JWT와 OAuth의 차이점은 무엇인가요?
- JWT 사용 시 주의사항은 무엇인가요?

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Jh P님의 프로필 이미지
Jh P

작성한 질문수

질문하기