주제목차내용인증 유지란 ?🌼 서버 세션 방식보안 관점에서 세션 방식은 ? 서버 세션 인증 방식이 마이크로 서비스에는 어떤 문제가 있는지? 🍉 JWT 방식 (JSON Web Token) 🌳 차이점
주제
JWT 인증이란 무엇일까?
목차
내용
인증 유지란 ?
- 사용자가 로그인한 이후 특정 시간 내에는 다시 로그인하지 않아도 사용자의 로그인 상태를 계속 유지 시켜주는 개념
- 인증 유지 개념이 없는 시스템 이라면?
- 사용자는 화면이 전환될 때 마다 매번 로그인을 해야하거나
- 서버에서는 매번 요청에 대해 사용자가 이 요청을 처리할 수 있는 사용자인지에 대해 검증 과정을 거쳐야한다.
- 대부분의 서버는 처음 접속 시 로그인 과정을 통해 인증 받은 사용자의 권한 정보를 쉽고 빠르게 접근 가능한 방식으로 보관하고, 로그인 된 사용자를 유일하게 식별할 수 있는 인증 키를 등을 발급하여
- 인증 키 정보를 이용해 계속 요청을 보내는 방식을 사용합니다.
🌼 서버 세션 방식
웹 초창기 부터 사용하던 방식
- 사용자 로그인 시 서버는 사용자 인증을 완료하고, 인증된 사용자 정보를 접근이 빠른 저장소인 메모리나 캐쉬 등에 저장
- 서버는 서버에 저장된 사용자 인증 정보의 유일한 키를 발급하는데, 이 키를 세션키 라고 부른다.
- 서버는 로그인에 대한 응답으로 이 세션키를 클라이언트에게 전달한다.
- 클라이언트는 받은 세션키를 클라이언트의 저장공간에 저장한다.
- 클라이언트는 서버로 작업을 요청할 때 매번 이 세션 키를 같이 전달한다.
- 서버는 클라이언트의 요청에서 세션 키를 이용하여 서버에 저장된 인증 정보에 있는지 여부와, 어떤 사용자의 요청인지 확인한다.
보안 관점에서 세션 방식은 ?
- 세션 방식 보안에서 가장 이슈가 되는 부분은 클라이언트가 가지고 있는 세션키가 유출되는 경우로, 세션키가 유출되면 악의적으로 서버에 요청을 보낼 수 있게 된다.
- 세션 키가 유출되는 피해를 최소화하기 위해 세션 만료 시간을 설정한다. 일반적으로 몇십분 또는 몇시간 이내로 설정하는 경우가 많다.
- 세션 유효시간이 1시간인 경우 1시간 이후에 오는 요청은 만료된 요청으로 간주하고 다시 로그인을 요청한다.
- 세션 유효 시간의 기준은 클라이언트로부터 마지막 요청 이후 시간을 사용한다.
- 이를 위해서 서버는 클라이언트로 부터의 매번 요청에 대해 세션 사용 시간을 계속 갱신한다.
- 세션 정보를 DB에 저장해도 되지만 매번 요청이 올 때 마다 세션 정보를 UPDATE해야 하기 때문에 DB에 저장하지 않고, 메모리 또는 캐시에 저장한다.
서버 세션 인증 방식이 마이크로 서비스에는 어떤 문제가 있는지?
- 사용자의 권한에 변경이 발생했을 때 즉시 반영할 수 있는 장점이 있다.
- 서버가 여러대 있을 경우?
- 서버의 메모리에 세션 정보를 보관하는 경우 사용자가 로그인 시 접속한 서버에만 세션 정보가 있기 때문에 사용자가 로그인 이후 다른 서버로 요청을 보내면 세션이 없어 다시 로그인을 해야하는 문제가 발생
- 방안은 ?
- 특정 사용자의 요청은 동일한 서버로만 보내는 방법
- 세션 정보를 서버의 메모리가 아닌 공유 캐시 등에 저장하는 방법
- 세션 정보를 모든 서버가 동일하게 가지는 방법
🍉 JWT 방식 (JSON Web Token)
- 서버에 세션 정보를 저장하지 않고, 로그인 시 클라이언트에게 로그인 사용자 정보가 포함된 토큰을 발행하고
- 클라이언트는 서버에 어떤 작업을 요청할 때마다 이 토큰을 같이 보내고, 서버에는 토큰에 포함된 사용자 정보를 이용하여 인증, 인가를 처리하는 방식입니다.
- 인증을 유지한다는 개념보다는 인증된 값을 계속 제공한다고 볼 수 있습니다.
- JSON 으로 만들어진 인증 관련 정보를 인코딩한 토큰을 인증하는 방식
- 사용자 로그인 시 서버는 사용자 인증을 완료하고 외부에 노출되어도 문제가 없는 인증관련 정보(사용자 ID, 권한 등)를 JSON 형태로 만든다. ⇒ Payload
- JSON 형태의 Payload를 base64 인코딩으로 문자열을 만들고, 미리 정한 시스템의 secretKey를 이용하여 서명 문자열을 생성한다.
- Header 정보, 인증 정보(payload), 서명 문자열을 하나의 문자열로 합친 후 클라이언트로 전송한다.
- 서버는 인증 요청에 대한 응답으로 이 인코딩된 문자열을 클아이언트로 전달한다.
- 클라이언트는 서버로부터 받은 토큰을 클라이언트의 저장공간에 저장한다.
- 클라이언트는 매번 요청 시 이 토큰을 서버로 같이 전달한다.
- 서버는 클라이언트의 요청에서 받은 토큰 값을 이용하여 어떤 사용자의 요청인지 등을 확인한다.
🌳 차이점
- 인증정보 보관 장소
- 인증이 된 후 해당 키가 어떤 사용자의 것인지에 대한 정보 저장을 어디에서 하는지
- JWT Token 은 Token 내에 인증된 사용자의 정보를 가지고 있어서 요청 받은 모든 서버에서 확인이 가능
- 인증된 정보 노출 여부
- 인증 완료 후 클라이언트로 요청 시 사용할 사용자 정보를 어디에 저장할 것인가?