HTTP의 특성 - 무상태 (Stateless)
HTTP는 서버-클라이언트 모델을 따르는 프로토콜로, 클라이언트가 서비스를 요청하고 서버가 이에 응답함으로써 데이터를 교환합니다. HTTP는 무상태성과 비연결성이라는 특징을 가지고 있습니다. 여기서 주목할 특징은 무상태성으로, 서버가 클라이언트를 상태를 보존하지 않는다는 것입니다. 그래서 서버는 클라이언트의 이전 요청에 대한 정보를 기억하지 않으므로, 요청을 할 때마다 새로 서버에 연결해야 합니다.
로그인 시스템에서 권한 부여하기
로그인 시스템에서 Authorization(권한 부여)는 중요한 역할을 수행합니다. 이를 통해 로그인 상태를 유지하는 사용자만이 특정 기능을 이용할 수 있습니다. API 요청을 할 때마다 로그인을 반복할 수 없으므로 로그인 상태를 유지시키는 기술이 필요합니다. 사용자 인증을 관리하는 주요 기술로는 세션과 JWT(JSON Web Tokens)이 있습니다. 둘 중 어느 것을 사용하는 것이 보안성과 구현의 용이성 측면에서 더 유리한지 고민하였습니다.
1) 세션 기반 인증
세션은 클라이언트가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하는 시점까지 클라이언트를 구분하고, 이에 따라 다른 권한을 주기 위해 사용되는 기술입니다.
세션 기반 인증에서는 사용자 정보를 서버 측에서 관리합니다. 세션 정보는 세션 DB에 저장되며, 클라이언트는 세션 ID를 가지고 있습니다.
HTTP 요청 시, 쿠키에 세션 ID를 담아 보내고 서버에서는 DB에서 해당 세션 ID를 조회함으로써 클라이언트를 식별합니다. 만약 HTTP 요청을 보낼 때 쿠키에 세션 ID가 포함되어 있지 않다면, 서버는 세션 ID를 생성해 쿠키에 담아서 클라이언트에게 반환합니다.
세션의 주요 장점은 사용자 정보를 직접 쿠키에 담아 전달할 필요가 없다는 것입니다. 이는 쿠키에 정보를 직접 저장할 경우 발생할 수 있는 보안상의 위험을 줄입니다. 클라이언트가 세션 ID만 관리함으로써, 서버 측에서 모든 처리를 담당하게 되어 보안성이 향상됩나다. 하지만 세션 하이재킹과 같은 보안 위협에 취약할 수 있습니다. 세션 ID가 탈취되더라도 DB에 저장된 해당 세션을 삭제함으로써 문제를 해결할 수 있습니다.
단점으로는 모든 사용자의 인증 정보를 서버에서 관리해야 하기 때문에, 대규모 사용자가 있는 경우 DB 확장이 필요하고 서버의 부하가 증가할 수 있습니다.
2) JWT 기반 인증
JWT는 일종의 확인서로, 성공적으로 로그인을 하면 서버에서 서명된 확인서(문자열 토큰)를 제공합니다. 이후 api를 호출할 때마다 JWT를 서버에게 같이 전달하면서 권한을 부여받습니다. 서버에서 JWT만 확인해 권한을 부여하기 때문에 따로 DB 리소스가 필요없습니다.
하지만 토큰이 노출되었을 경우, 누구든지 해당 토큰을 사용하여 시스템에 접근할 수 있습니다. 토큰의 헤더와 페이로드는 누구나 확인할 수 있으므로, 민감한 정보를 포함하고 있다면 큰 위험을 초래할 수 있습니다. 이 문제에 대응하는 방법으로 access token(JWT)의 유효기간을 짧게 설정하고 refresh token를 사용하는 것입니다.
'Backend Roadmap > Web' 카테고리의 다른 글
[TypeORM] EntityRepository is deprecated 해결하기 (0) | 2024.07.02 |
---|