jwt는 서버가 이중 삼중 여러대 일때 세션보다 장점을 갖습니다 보통 큰서비스들은 서버가 한대가 아닌 수십 수백대인데 세션의 경우 로드밸런싱으로 유저가 처음 방문했을때는 1번서버로 방문하여 세션이 남아 있지만 두번째 방문했을때 1번이 아닌 2번으로 붙게되면 세션정보가 없어 인증이 안됩니다 이때 redis 세션통합으로 개발하거나 서버에 상관없는 jwt로 인증을 구현합니다
@@진_비 네 맞습니다. 보안에 세션보다 취약하다는 단점이 있죠 세션은 탈취당하면 서버에 세션정보가 남아있기에 강제 로그아웃이나 제어하는 방법이 있습니다만 토큰 발급은 이미 토큰을 발급한뒤고 서버에 아무것도 없기에 제어할 방법이 없어요 기업들에서는 병행해서 많이 쓰는것으로 알고 있습니다. jwt 보안 단점을 보완하기위하여 유투버님께서 알려주신 jwt access token외에 expire 기간이 긴 refresh token을 같이 발급(두개) 하거나 블랙리스트 db를 하나 만들어 탈취당했을때에 위험을 방지하기도 하는데 이러면 statusful 방식으로 세션하고 비슷해져버려서 의미가 사라진다는 단점이 있지만 정보를 덜 저장한다는 의미에서는 쓰이고 있죠 세션에서도 여러 서버로 로드밸런싱 하는경우 세션정보를 잃지 않기 위해 아래와 방법을 쓰고 있습니다. 1. 고정 세션 2. 세션클러스터링 2-1) 세션복제 2-2) 세션 스토리지 결국은 상황에 맞춰쓰는데.. MSA 구축을 추구하는 기업에서는 JWT를 늘려가려는 추세인듯 싶습니다.
제 생각에는 세션같은경우, 세션DB를 통해 해당 유저를 Find하여 강제 세션아웃 시킬수 있기때문에 원격이 된다고 하신것 같습니다. JWT의 경우에는 DB나 서버의 자원에서 갖고있는 부분이 아니기때문에, 일반적으로 Decode하여 유저인지 인증하는 용도로 쓰입니다. JWT를 Expire(만료) 시키기 위해서는 Client에서 요청을 보내야만 JWT를 만료 할 수 있습니다. 순수하게 JWT 자체로 계정이 3명이니, 원격 로그아웃을 해주세요. 라는 가정을 하신다면, JWT를 발급받은 ID들이 DB혹은 서버의 메모리에 저장되어야 합니다. 그렇게 될 경우 JWT의 장점인 서버 자원을 사용하지 않는다에 위배됩니다. 해당 방식은 세션과 동일해 지는 부분이구요. JWT자체에 관한 정보를 Server에선 갖고 있지 않으므로, 요청이 오기전까지 Expire할 수 없습니다. 만약 원격 Expire를 하신다면, 요청이 올때까지 기다렸다가 해당 JWT를 Decode한 이후, UserID를 확인하여 Expire하는 Logic을 구현하시면 될 것 같습니다. 흔치 않는 경우이기때문에 해당 설명에서는 원격 로그아웃이 불가능하다 라고 하시는것 같습니다.
세션 같은 경우 A = User1 이런 식으로 매칭해서 서버에 저장하고 있기 때문에 세션 값으로 A를 보내주면 User1 이라고 인식하는 방식입니다. 그래서 서버가 다르면 인식하지 못 하는 거고요. 로그아웃은 목록에서 A라는 값만 지우면 됩니다. JWT 같은 경우는 값 자체를 복호화해서 정보를 알아내는 방식입니다. 예를 들어 JWT가 User1_AA_Gildong_AA_11/1 라고 했을 때 이 값 자체를 복호화 해서 User1, Gildong, 11/1 이라는 정보를 얻어 유저를 구분하는 방식입니다. 토큰 안에는 만료일 정보도 같이 들어있는데 이 만료일이 지나면 토큰은 사용할 수 없습니다. 로그아웃이라는 개념 자체가 없고 토큰 만료일을 30분, 2시간 등으로 짧게 설정하고 자주 자주 발급하는 방식으로 사용하거나 로그아웃 요청이 들어오면 블랙리스트를 만들어서 관리하는 식으로 사용합니다. +) 윗 분 말씀에 첨언하자면 JWT는 서버에서 임의로 만료시킬 수 없습니다.
헷갈리는 용어들을 정말 쉽게 딱딱 이해할 수 있게 해주셔서 감사합니다 ㅠ_ㅠ 글로만 읽었던 재미없는 정의들이 그림과 영상으로 보니 정리가 잘 되는거 같아요 아직까지는 계속 자막에 눈이 가고 있지만...ㅎ 영상을 보면 볼수록 영어도 쪼금씩 더 들리는거 같아요 좋은 영상 너무나도 감사합니당❤
db는 말그대로 그냥 아무거나 데이터를 저장하는 장소입니다. 세션 db라고 한다면 세션값만 저장하는거겟죠. 여기서 db를 따로 나눈다고 한다면, 그 이유는 db 하나에 모든 정보가 들어가면 db에 정보를 읽고 쓸때 부하가 너무많이들어가니까 나눠놓은것일뿐입니다. 그래서 딱히 나누고 안나누고는 개발자 자유이고 기기성능이나 서버사용량 등에 따라 다른겁니다. 다만 세션의경우 모든 요청에 모조리 포함되니까 그만큼 db를 읽는양이 압도적이라서 db를 따로 빼놓는 경우가 대부분일뿐 꼭 나눠야하는건아니에요
당근마켓 강의보다 와서 보는데 2년전에 이런 좋은 영상이 있는지 몰랐네요. 질문이 하나 있는데, 토큰은 그저 내용을 담아둔 긴 string 데이터이고 JWT는 정보를 가지고 있는 토큰 이라고 했는데 JWT는 그러면 토큰을 사용하는 방법을 뜻하는 건가요? 결국 JWT도 토큰을 사용하는건데 이 토큰에 필요한 정보를 담아둔 상태인걸 말하는 건가요? 제가 이해한게 맞는지 답변해주시면 감사하겠습니다. 언제나 잘 보고있습니다. 감사합니다
0:44 쿠키, 2:02 세션 8:13 토큰을 사인하고 이를 통해 유효한지를 검증한다는 것, 8:23 세션 vs jwt 장단점 8:30 서버는 로그인된 모든 유저의 정보를 이용 세션을 이용하면 특정 유저 쫓아내거나 저장 원하지 않는 곳에서 삭제 가능 서버가 누가 로그인했는지 정하고 세션DB가 있기 때문 이를 위해서는 DB를 유지
질문이 있습니다. JWT는 사이즈가 크기 때문에 쿠키에 저장되는 것이 아니라고 하셨는데 그러면 브라우저가 서버에 request를 보낼 때 어디에 저장하고 있다가 서버에 보내는 건가요? 제가 알기로 쿠키 저장소는 브라우저에서 안전하게 보관하는 저장소이지만 다른 곳은 그렇지 않기 때문에 JWT는 위험하다는 의견도 많던데요.
암호화된 도메인 쿠키를 이용하면 같은 도메인에 속한 여러 사이트에서 사용자 인증을 구현할수 있습니다. 서버 세션을 쓰지않고 클라이언트 브라우저가 매번 자동으로 보내오는 암호화된 쿠키를 읽어 서버가 해독 유효성 검사 및 사용자 정보 추출을 해서 씁니다. 쿠키인데 방식은 jwt 비스무레하고 뭐 그렇습니다. 요즘도 그런가 모르겠는데 포털사이트들이 이런식이었습니다.
질문입니다. 대용량 데이터분석, 머신러닝을 위한 노트북은 뭐가 중요한가요? cpu, gpu, 휴대성 중에 어떤 것을 주로 봐야할까요? legion 7(i7, 3070 tgp140W 무거움) zephyrus m16(i9 3060 tgp95W) 중에 고민중입니다. 최근 가상환경으로 인해 gpu의 중요성이 줄어든것인지 여쭤보고 싶습니다.
질문입니다. 제가 아는 범위 내에서는 세션은 서버의 저장공간입니다. 해당 영상에서 소개된 내용은 그저 이 저장공간에 계정 정보를 넣어서 관리하는 것인가요? 아니면 아예 기존에 알던 세션과는 무관한 내용일까요? 또한 이 서버의 저장공간인 세션에 대한 DB는 따로 관리가 가능한 건가요?
서버에서는 토큰을 저장하지 않습니다. 1. 클라이언트에서 최초 로그인 시 서버에서 jwt를 생성해서 클라이언트에게 보냅니다. 2. 클라이언트는 받은 jwt를 저장하고, 다음에 리퀘스트를 보낼 때 인증이 필요한 경우 jwt를 포함해서 서버에 요청하는 형식입니다. 3. 서버에서는 클라이언트에서 받은 jwt를 검증하고 해당 리퀘스트에 대한 리스폰스를 작성합니다.
클라이언트로 받은 데이터는 무조건 신뢰해요. 그래서 별도로 저장하지 않고 사용하죠. 그럼 사용자가 임의로 변경 했을 때 문제가 될 수 있죠? 그래서 JWT 토큰을 발급할 때 발급한 내용에 대해서 전자서명 후 JWT에 붙여서 줍니다. 검증한다는건 이 Signature를 검증한다는 의미이구여😄
1. 서버는 jwt를 생성(서명)할 때 필요한 시크릿 키(문자열)만 가지고 있습니다. 2. 예를들어 { USERID : 1 } 이라는 정보를 서버가 가지고 있는 시크릿 키로 jwt로 생성하였을 때, "asdf"라는 jwt가 생성되었다고 가정합시다. 3. "asdf"를 복호화 해서 { USERID : 1 } 이라는 정보가 들어있다는 건 누구나 알 수 있습니다만, 이 정보로 "asdf"라는 jwt를 생성 할 수 있는건 시크릿 키를 가지고 있는 서버만이 가능하지요.