🔐
인증과 인가
November 08, 2023
인증과 인가
인증(Authentication)
사용자의 신원을 검증하는 행위, 보안 프로세스에서 첫 번째 단계
인가(Authorization, 권한부여)
사용자에게 권한을 허용/거부하는 행위
우리가 사용하는 HTTP의 특성
- 비연결성 : 리소스 절약을 위해 서버는 하나의 요청에 대해서 응답을 주고 연결을 끊어버린다.
- 무상태 : 서버는 클라이언트가 이전에 어떤 상태였는지 알지 못한다.
🤔 그럼 연결이 되어있지 않고 상태도 안가지고 있는데 어떻게 인증과 인가를 진행하는걸까?
쿠키-세션 방식
사용자의 인증 정보가 서버의 세션 저장소에 저장되는 방식이다.
- 사용자가 로그인에 성공하면 서버는 사용자의 인증 정보를 세션 저장소에 저장하고, 사용자의 정보와는 관계없는 SESSION ID를 생성하여 클라이언트에게 응답값으로 전달한다.
- 클라이언트는 SESSION ID를 쿠키에 저장하고 앞으로의 요청마다 SESSION ID를 함께 보낸다.
- 서버는 요청값에 있는 SESSION ID에 해당하는 세션 정보가 세션 저장소에 있다면 사용자를 인증된 사용자로 판단한다.
문제점
쿠키-세션 방식은 다중 서버 환경에서 각 서버가 개별적으로 세션 저장소를 가지는 경우에 문제가 발생할 수 도 있다.
매번 같은 서버로 요청이 전달되지 않고 각 세션저장소 별로 다른 인증정보를 가지고 있기 때문에 사용자 식별이 되지 않기 때문이다.
해결방법
- 로드밸런서를 통해서 사용자를 식별하여 이전에 통신한 서버로 요청이 가도록 경로를 지정해주는 방법
- 다중 서버의 모든 세션 저장소를 동일하게 유지하는 방법
두번째 방식의 경우 다중 서버 환경임에도 불구하고 단일 저장소가 감당해야할 부하가 늘어난다. 위와 같은 고민을 해결하려면 JWT(Json Web Token) 방식을 사용하면 된다.
JWT 기반 인증 방식
인증에 필요한 정보들을 서버에 저장하지 않고 암호화 시킨 토큰으로 클라이언트가 직접 들고 있는 방식
- 사용자가 로그인에 성공하면 서버는 인증 정보를 암호화해서 토큰 형식으로 응답값에 담아 전달한다.
- 클라이언트는 토큰을 저장하고 있다가 요청값에 토큰을 담아서 보낸다.
- 서버는 토큰을 발견하면 가지고 있는 비밀키로 토큰을 해독하여 사용자 검증을 한다.
그렇다고 무조건 JWT 인증 방식이 좋은 것은 아니다. JWT로 인증을 하게 되면 구현의 복잡도가 증가하고 비밀키 유출 시 조작도 가능하게 된다. 그럼에도 JWT를 사용하는 이유는 서버의 부담이 줄어들기 때문이다.