- Authentication (인증)
: 사용자가 누구인지 확인하는 과정으로 주로 로그인 프로세스를 의미- Authorization (권한 부여)
: 인증된 사용자가 특정 자원에 접근하거나 해당 자원을 사용할 권한이 있는지 결정하는 프로세스
간단히 말하면
로그인을 Authentication ,
로그인 상태의 사용자만 사용할 수 기능을 사용하게 해주는 것을 Authorization 이라고한다.
매번 요청할때마다 로그인을 할 수 없으니 로그인 상태를 유지시키는 기술이 필요한데
session과 JWT를 사용해 그 기술을 구현할 수 있다.
브라우저와 웹서버가 연결되어 브라우저가 종료될 때까지의 시점을 Session이라고 한다.
Session 기반 인증은 사용자의 인증 정보가 서버의 세션 저장소에 저장 되는 방식이다.
< 과정 >
사용자가 로그인을 하면 서버는 해당 인증 정보를 서버의 세션 저장소에 저장하고 사용자에게 세션 정보의 식별자인Session ID를 발급한다.
발급된 Session ID는 브라우저의 쿠키 형태로 저장되지만, 실제 인증 정보는 서버에 저장되어있다.
브라우저는 인증 절차를 마친 이후 요청마다 HTTP Cookie Header에 Session ID를 함께 서버로 전송하고 요청은 전달받은 서버는 Session ID에 해당하는 세션 정보가 세션 저장소에 존재한다면 해당 사용자를 인증된 사용자로 판단하여 권한을 부여한다.
보안성 : Session ID가 클라이언트에서 보이지 않고, 서버에서 저장되기 때문에 상대적으로 안전
유연성 : Session은 서버에서 관리되기 때문에 클라이언트가 Session 데이터를 직접 조작하기 어려우며 서버에서 세션을 만료시키거나 관리할 수 있음
로그아웃 관리 : 새로고침이나 브라우저 종료 등으로 인한 세션 만료 기간 설정이 가능해 서버측에서 세션을 무효화시켜 로그아웃을 쉽게 관리할 수 있음
확장성 : 서버의 메모리나 DB에 Session 정보를 저장하기 때문에 서버 자원을 많이 사용하므로, Session의 규모가 커지거나 많은 Session이 발생하는 경우 서버의 확장성이 저하될 수 있음
서버 부하 증가 : 클라이언트 요청마다 서버에서 Session 정보를 확인해야하기 때문에 많은 요청이 있을시 서버 부하가 증가할 수 있고, 서버 응답시간이 늦어질 수 있음
분산 환경 어려움 : 서버 확장성을 유지하기위해서는 세션 클러스터링이나 데이터베이스 샤딩과 같은 작업이 필요할 수 도 있는데 이는 여러 서버 간의 데이터 일관성과 동기화에 어려움을 초래할 수 있음
JWT는 JSON Web Token의 약어로,
JWT 기반 인증은 사용자의 인증 정보를 클라이언트가 직접 들고 있는 방식이다.
< 과정 >
사용자가 로그인을 하면 서버는 사용자 정보를 기반으로 사용자의 인증정보와 해당 정보의 유효성 검증을 위한 서명이 들어 있는 JWT를 생성하고 클라이언트에게 전달한다.
클라이언트는 요청마다 사용자가 가지고 있는 JWT를 HTTP Authorization Header에 실어 보내고 요청을 전달받은 서버는 JWT가 위변조 되었거나, 만료시간이 지나지 않은지 확인 후 JWT에 담겨 있는 사용자 인증 정보를 확인해 사용자에게 권한을 부여한다.
확장성과 분산 처리 : JWT는 서버에서 상태를 관리하지 않으므로 서버의 확장성이 향상됨
클라이언트 측 저장 : 토큰은 클라이언트에 저장되기때문에 서버에서 세션 상태를 유지할 필요가 없어 서버와의 통신이 감소해 서버 부하를 줄일 수 있음
유연성과 간결성 : 토큰은 JSON 포맷이며 필요한 사용자 정보를 포함할 수 있어, 페이로드에 추가 데이터를 넣을 수 있음
분리된 인증과 인가 : 토큰은 클라이언트에 의해 보관되며, 보안상의 이유로 다른 도메인에서도 사용 가능하므로 인증과 권한 부여를 분리하여 더 유연하게 처리할 수 있음
분리된 인증과 인가 : 토큰이 클라이언트에 저장되기 때문에 큰 야의 정보를 담을 경우 네트워크 부하가 발생할 수 있으며, 토큰이 탈취될 경우 보안 문제가 발생할 수 있음변경 불가능한 특성 : 한 번 발급된 토큰은 만료되거나 서버에서 강제로 무효화되기 전까지는 변경이 불가능함보안 취약점 : 토큰이 노출되거나 탈취될 경우 탈취한 사람이 해당 유저처럼 행동할 수 있음싸커마켓의 백엔드는 멋쟁이 사자처럼에서 제공하는 RESTful API를 활용하고있다.
JWT 기반 인증 방식이 stateless한 특성과 효율적인 API 호출, 경량성과 확장성 등의 특징으로 인해 RESTfulAPI와 잘 맞는 인증방식인 것 같아 JWT 기반 인증 방식을 이용해 로그인을 구현 해볼 생각이다.
참고
https://www.youtube.com/watch?v=XXseiON9CV0&t=211s
https://cordcat.tistory.com/108
https://hudi.blog/session-based-auth-vs-token-based-auth/
https://velog.io/@gotaek/%EC%84%B8%EC%85%98Session%EA%B3%BC-JWT