728x90
반응형
스프링 시큐리티에서 이제 JWT Token 을 가지고 동작을 진행할 때 어떻게 수행할 수 있을까?
JWT(JSON Web Token)는 로그인 후 인증 상태를 유지하기 위해 사용되는 토큰입니다. 사용자는 로그인 성공 시 서버로부터 JWT를 발급받으며, 이 토큰은 사용자가 이후 서버에 요청을 보낼 때마다 인증을 위해 사용됩니다. JWT를 로그인 이후에도 계속 들고 있는지에 대한 구체적인 내용은 다음과 같습니다:
1. JWT의 발급과 저장
- 발급: 사용자가 로그인에 성공하면 서버는 사용자 정보를 기반으로 JWT를 생성합니다. 이 토큰에는 인증 관련 정보(예: 사용자 ID, 권한 등)와 만료 시간(exp) 등이 포함됩니다.
- 저장: 클라이언트는 이 JWT를 저장하여 이후 요청에서 사용합니다.
- 일반적으로 저장되는 위치:
- 브라우저:
- localStorage: 토큰을 영구적으로 저장. 브라우저가 닫혀도 유지됨.
- sessionStorage: 세션 동안 유지. 브라우저가 닫히면 삭제됨.
- 쿠키: 서버와 자동으로 통신되지만, XSS 공격에 노출될 위험이 있음. (Secure, HttpOnly 옵션 설정 필요)
- 모바일 앱: 앱 내부 저장소 (예: SharedPreferences, Keychain).
- 브라우저:
- 일반적으로 저장되는 위치:
2. 로그인 후 JWT를 계속 들고 있는 이유
JWT는 서버와 클라이언트 간의 **무상태 인증(stateless authentication)**을 지원하기 위한 방식입니다. 클라이언트는 로그인 후 서버와의 모든 요청에 JWT를 포함시킵니다. 서버는 매 요청마다 JWT를 검증하여 사용자를 인증합니다.
- 들고 있는 이유:
- 인증 유지: 서버는 상태를 저장하지 않으므로, 클라이언트가 JWT를 보낼 때마다 사용자를 인증할 수 있습니다.
- 효율성: JWT는 자체적으로 인증 정보를 포함하므로, 추가 데이터베이스 조회 없이 인증이 가능합니다.
- 무상태성: 서버는 세션을 관리할 필요가 없으므로 확장성이 뛰어납니다.
3. JWT의 만료 시간과 갱신
JWT는 만료 시간이 설정되며, 클라이언트는 만료되기 전에 토큰을 갱신해야 합니다.
- 만료 시간(exp):
- JWT에는 만료 시간(예: 1시간, 24시간 등)을 포함할 수 있습니다.
- 클라이언트가 만료된 토큰을 서버에 보낼 경우, 서버는 이를 거부하고 재인증(로그인)을 요청합니다.
- 갱신 방법:
- 리프레시 토큰(refresh token):
- 클라이언트는 로그인 시, 액세스 토큰(JWT)과 리프레시 토큰을 모두 발급받습니다.
- 액세스 토큰이 만료되면, 리프레시 토큰으로 새로운 액세스 토큰을 요청합니다.
- 리프레시 토큰은 일반적으로 더 긴 만료 시간을 가지며, 보안성을 위해 서버에서 관리됩니다.
- 리프레시 토큰(refresh token):
4. JWT를 들고 있는 경우의 보안 문제
JWT를 저장하고 사용하는 방식에 따라 보안 위협이 발생할 수 있습니다.
- XSS(크로스 사이트 스크립팅): localStorage나 sessionStorage에 저장된 JWT가 노출될 위험이 있음.
- 쿠키 사용 시 CSRF(Cross-Site Request Forgery): 토큰을 쿠키에 저장하면 CSRF 공격에 노출될 수 있음.
- 해결책: CSRF 토큰 사용, 쿠키의 SameSite 속성 설정.
- 만료되지 않은 토큰의 탈취: 탈취된 토큰은 만료 전까지 유효하므로 보안 사고가 발생할 수 있음.
5. JWT를 들고 있는지 여부와 대안
- 로그인 후 계속 들고 있는지?
- 그렇다: 클라이언트는 JWT를 저장하고 매 요청 시 인증을 위해 서버로 보냅니다.
- JWT는 클라이언트에 저장되며, 클라이언트가 로그인 세션을 유지하는 한 들고 다닙니다.
- 대안:
- 전통적인 세션 기반 인증: 서버가 세션을 관리하고 클라이언트는 세션 ID를 쿠키로 전달.
- OAuth2와 리프레시 토큰 조합: 짧은 수명의 액세스 토큰과 긴 수명의 리프레시 토큰 사용.
6. JWT를 서버로 매 요청 시 보내는 방법
클라이언트는 일반적으로 JWT를 HTTP 요청의 Authorization 헤더에 포함하여 보냅니다.
http
코드 복사
GET /api/resource HTTP/1.1 Host: example.com Authorization: Bearer <JWT>
결론
- 로그인 후 JWT는 클라이언트에서 계속 저장되어야 하며, 서버와의 모든 요청에 사용됩니다.
- 만료된 토큰은 리프레시 토큰으로 갱신하거나 재인증을 통해 새로 발급받아야 합니다.
- JWT 저장 및 전송 방식에서 보안 위협을 최소화하는 것이 중요합니다.
728x90
반응형
'이유's Programming > Spring' 카테고리의 다른 글
Spring security 동작 과정에 대해서 공부 (0) | 2024.11.20 |
---|---|
ApacheBenchTest 하는 법 (1) | 2024.10.16 |