24-05-09 인증/인가, 쿠키/토큰
오늘은 스프링 숙련 강의를 거의 끝까지 다 들어보았다. 일단 전체 그림은 어느정도 파악했다고 할 수 있을 것 같지만 세부적으로 하나하나 완전히 이해했다고 하기는 어렵다. 이제 다시 앞에서부터 차근차근 살펴보는 시간을 가져봐야 할 것 같다.
오늘은 인증/인가 이론 공부를 하면서 알게된 것들을 정리해보았다.
1. 인증/인가, 쿠키/토큰
1-1. 인증/인가
가장 먼저 인증과 인가가 무엇인지에 대해서 공부해봐야할 것 같아서 찾아보았다.
인증이란 누군가가 자신이 주장하는 바로 그 사람인지 증명하는 것을 말한다. 예를들어 어떤 사람이 신분을 증명하기 위해 신분증을 제시해야 했다면 인증을 받은 거라고 할 수 있다.
여기서 누군가는 어떤 것 또는 무언가가 될 수도 있고 사람은 어떤 장치나, 어플리케이션 그리고 서비스 안에서 어떤 것이될 수도 있다. 어떤 장치를 통해 서비스에 접속 했을 때 이 장치가 서비스에 등록된 장치인지 아닌지 확인하는 것 역시 인증이다.
어플리케이션 인증은 비밀번호, 보안키 등 소프트웨어 기능을 사용하기 때문에 실제 현실 상황에서 신분증을 확인하고 사진과 대조하는 등의 인증보다 더 수월하다. 저장된 데이터와 제공된 데이터를 비교해서 두 데이터가 일치해야 인증이 되게 되는 것이고 이는 실제 세계와 어플리케이션 내에서 모두 똑같이 동작한다.
인가는 권한을 부여하는 것으로 누군가가 특정 자료, 리소스, 작업에 접근할 수 있는지 확인하는 것을 말한다.
사용자가 인증을 받게 되면, 한 명 이상의 사용자에게 허용된 사용 가능한 자원 또는 작업에 접근할 수 있다. 인증된 사용자는 접근에 대한 요청을 하게되면 애플리케이션은 인가 여부를 결정해야하고, 사용자의 인가가 확인되면 사용자에게 접근 권한이 부여된다. 인가가 확인되지 않은 경우, 접근 권한이 없으므로 요청이 거부되었다는 것을 사용자에게 알려주게 된다.
1-2. 쿠키/세션 인증 방식과 토큰 인증 방식
- 쿠키/세션 인증 방식
쿠키는 클라이언트(브라우저) 쪽에 저장되는 작은 데이터 조각으로 상태 정보를 저장하기 위해 사용된다. 서버에서 전송되어 클라이언트에 저장이되고 서버에서 요청이 있을 때마다 자동적으로 서버에 전송된다.
세션이란 서버 측에서 클라이언트의 상태를 유지하는 기술이다. 클라이언트에게 세션 ID를 부여하여 클라이언트 정보를 관리하는데 이때 세션 ID를 부여하기 위해 사용하는 것이 쿠키이다. 매 요청마다 세션ID가 쿠키를 통해 서버측에 전송되기 때문에 확인하기 쉽고 세션을 유지할 수 있게 된다.
클라이언트 관련 정보를 모두 서버에서 관리하기 때문에 보안이 좋고 세션 ID만 주고받기 때문에 트래픽 사용이 적다는 장점이 있다.
그렇지만 세션 정보를 서버 측에서 저장하기 때문에 서버 확장성 측면에서 불리하다는 단점이 있다.
- 토큰 방식
인증 정보를 서버가 생성한 토큰이라는 곳에 저장하고, 이것을 클라이언트가 저장하여 갖고 있게됩니다. 서버측에서는 이 토큰을 저장하고 있지 않지만 해당 토큰이 자기가 생성한 토큰인지 검증할 수 있습니다.
서버에서 토큰을 저장하지 않고 세션 상태를 유지하지 않기 때문에 무상태(Stateless)하다고 할 수 있다.(클라이언트의 상태를 보존하지 않는다.) 따라서 확장성이 좋다.
또한 토큰 기반이기 때문에 서로 다른 별도의 시스템이라도 검증 방식을 공유할 수 있다면, 다른 로그인 시스템에서도 동일한 토큰으로 인증을 할 수 있다는 장점 역시 존재한다.
하지만 보안상 취약할 수 있기 때문에 유저의 중요한 정보를 담을 수는 없다. 세션 ID에 비해 데이터 사이즈가 크기 때문에 인증 요청이 많아지면 부하가 발생할 수 있다.
또한 쿠키/세션 방식과 달리 서버 측에서 강제로 로그인을 만료하도록 하는 것이 쉽지 않다는 단점 역시 존재한다.
2. 오늘 배운 것
- 스프링 모든 레이어를 연결하고 테스트하는 것 까지 마쳐보았다. 한 번 전체 과정을 쭉 둘러봤다는 것에 의의를 둬야겠다.
- 아직 완전히 이해가 가지 않는 부분들이 많다. 차근차근 하나하나 다시 살펴봐야겠다.