[SeSACx코딩온] session, token, refresh token, cookie
?
- 세션에 담긴 개인정보를 토큰에 담아서 상태를 계속하도록 유지하고
- 리프레쉬 토큰을 쿠키에 담아서 정보를 보호하고
- 토큰이 만료되면 쿠키에 담긴 리프레쉬 토큰을 확인해서
- 다시 재발급 및 반복하는지 여부.
정답
1. 사용자 로그인 및 세션 정보 토큰화
- 사용자가 로그인하면, 서버는 사용자의 ID, 권한 등 필요한 정보를 포함한 JWT 액세스 토큰을 생성합니다.
- 이 JWT는 사용자의 인증 상태를 클라이언트 측에서 관리할 수 있도록 합니다. 예를 들어,
{ userId: 1, role: 'admin' }
같은 정보를 포함할 수 있습니다. - JWT는 클라이언트에 전달되어 상태를 유지하는 역할을 합니다.
2. 리프레시 토큰 생성 및 보호
- 서버는 또한 리프레시 토큰을 생성하여, 이를 클라이언트의 쿠키에 저장합니다. 리프레시 토큰은 보안을 위해
httpOnly
,secure
옵션을 사용하여 쿠키에 저장되며, 클라이언트 측 자바스크립트에서 접근할 수 없습니다. - 리프레시 토큰은 보안 강화를 위해 쿠키에 담겨 있으며, 액세스 토큰이 만료된 후 이를 재발급받기 위한 용도로 사용됩니다.
3. JWT 액세스 토큰 만료
- JWT 액세스 토큰은 보통 짧은 유효기간(예: 15분)을 가지며, 이 시간이 지나면 토큰이 만료되어 더 이상 유효하지 않게 됩니다.
- 사용자가 만료된 액세스 토큰으로 서버에 요청을 보내면, 서버는 이 요청을 거부하고, 새로운 액세스 토큰이 필요함을 알립니다.
4. 리프레시 토큰을 사용한 액세스 토큰 재발급
- 클라이언트는 서버가 전달한 쿠키에서 리프레시 토큰을 꺼내어 서버에 보내고, 새로운 액세스 토큰을 요청합니다.
- 서버는 리프레시 토큰의 유효성을 검증한 후, 새로운 JWT 액세스 토큰을 발급합니다.
- 이렇게 발급된 새로운 액세스 토큰으로 사용자는 계속해서 인증된 상태를 유지할 수 있습니다.
5. 과정 반복
- 이 과정이 반복되면서, 클라이언트는 정기적으로 만료된 액세스 토큰을 리프레시 토큰을 통해 재발급받습니다.
- 사용자가 로그아웃하거나, 리프레시 토큰이 만료되거나, 서버에서 리프레시 토큰을 무효화하는 등의 상황이 발생할 때까지 이 상태가 유지됩니다.
결론
- JWT 액세스 토큰: 클라이언트 측에서 인증 상태를 유지하는 데 사용되며, 유효기간이 짧습니다.
- 리프레시 토큰: 클라이언트의 쿠키에 저장되어, 액세스 토큰이 만료될 때 새로운 액세스 토큰을 발급받는 데 사용됩니다.
- 토큰 갱신 및 보호: 리프레시 토큰을 사용해 액세스 토큰을 안전하게 갱신하며, 이 과정은 반복됩니다.
이 패턴은 보안과 성능, 사용자 경험을 모두 고려한 인증 방식으로, 많은 현대적인 웹 애플리케이션에서 사용되고 있습니다.
?
- 쿠키만 확인해서는 아무정보를 얻을수없는지 여부
정답
왜 쿠키만으로는 정보 확인이 불가능한가?
- 쿠키는 데이터의 저장 매체:
- 쿠키는 클라이언트 측에서 정보를 저장하고 서버에 전달하기 위한 방법입니다. 쿠키 자체는 단순히 문자열로 된 데이터를 담고 있을 뿐, 그 데이터가 무엇을 의미하는지, 유효한지, 신뢰할 수 있는지에 대해서는 아무것도 말해주지 않습니다.
- 쿠키에 저장된 정보는 검증이 필요:
- 예를 들어, JWT 토큰이 쿠키에 저장되어 있다면, 서버는 이 토큰을 읽고, 그 유효성을 검증해야 합니다. 이 검증 과정에서 토큰의 서명(signature)이 올바른지, 토큰이 만료되지 않았는지, 그리고 토큰에 포함된 정보(예: 사용자 ID, 권한 등)가 신뢰할 수 있는지를 확인합니다.
- 쿠키에 담긴 JWT 토큰의 내용은 토큰을 디코딩하고 서명을 검증한 후에야 비로소 사용 가능한 유효한 정보가 됩니다.
- 보안 및 암호화:
- 쿠키에 저장된 데이터는 서버와 클라이언트 간에 전송될 때 암호화되지 않는다면, 중간에 가로채거나 조작될 위험이 있습니다. 따라서 쿠키에 중요한 정보를 직접 저장하는 것은 위험할 수 있으며, 대부분의 경우 중요한 정보는 토큰이나 세션 ID 등 간접적으로만 접근할 수 있는 형태로 저장됩니다.
httpOnly
,secure
같은 플래그를 사용해 쿠키를 안전하게 저장하더라도, 서버 측에서 이 데이터를 해석하고 검증하는 과정이 필요합니다.
결론
- 쿠키는 정보의 저장 및 전달 매체일 뿐이며, 그 자체로는 의미를 해석하거나 정보를 확인할 수 없습니다.
- 쿠키에 저장된 데이터를 사용하려면, 해당 데이터를 해석하고 검증하는 추가적인 과정이 필요합니다. 예를 들어, JWT 토큰이 쿠키에 저장된 경우, 서버는 이 토큰을 해석하고 서명을 검증하여 유효성을 판단해야 합니다.
- 보안적으로도 쿠키를 신뢰할 수 없기 때문에, 쿠키의 내용을 서버 측에서 철저히 검증해야만 안전하게 사용할 수 있습니다.