인증과 인가
인증(Authentication)
인증은 해당 유저가 실제 유저인지 인증하는 개념이다.
스마트폰에 지문인식, 이용하는 사이트에 로그인 등과 같이, 실제 그 유저가 맞는지를 확인하는 절차이다.
인가(Authorization)
인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념이다.
예를 들어 관리자 페이지-관리자 권한 같은 것들을 들 수 있다.
우리가 자주 하는 로그인은 인증을 할 때(비밀번호를 입력하고 제출할 때)이고
회원/비회원 여부에 따라 다른 권한을 받는 것이 인가이다.
"웹 애플리케이션 인증"은 어떠한 특수성이 있을까?
일반적으로 서버-클라이언트 구조로 되어있고, 실제로 이 두가지 요소는 아주 멀리 떨어져 있다.
그리고 Http라는 프로토콜을 이용하여 통신하는데, 그 통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어진다.
비연결성(Connectionless)
서버와 클라이언트가 연결되어 있지 않다는 것이다.
채팅이나 게임같은 것들을 하지 않는 이상 서버와 클라이언트는 실제로 연결되어 있지 않다.
그 이유는 리소스를 절약하기 위해서인데, 만약 서버와 클라이언트가 계속 연결되어 있다면 서버의 비용이 기하급수적으로 늘어나기 때문이다.
그래서 서버는 실제로 하나의 요청에 하나의 응답을 내버리고 연결을 끊어버리고 있다고 생각하면 좋다.
무상태(Stateless)
서버가 클라이언트의 상태를 저장하지 않는다는 것이다.
기존의 상태를 저장하는 것들도 마찬가지로 서버의 비용과 부담을 증가시키는 것이기 때문에 기존의 상태가 없다고 가정하는 프로토콜을 이용해 구현되어 있다.
실제로 서버는 클라이언트가 직전에, 혹은 그 전에 어떠한 요청을 보냈는지 관심도 없고 전혀 알지 못한다.
하지만 우리가 인터넷을 사용할 때 이전의 정보들이 잘 있는것처럼 연속성 있게 사용한다고 느껴진다.
실제로 그렇게 느껴지기 위해서 개발자들이 많은 노력을 기울이고 있다.
예를들어 네이버 뉴스탭에 스포츠탭에 특정 기사를 본다고 생각하면
/News/Sports/9
와 같이 url을 계층적으로 설계하고, 다음 요청에 대한 api url을 이전 계층에만 둔다면 연속적으로 사용하고 있다고 느껴질 수 있다.
그렇다면 인증과 같이, 해당 유저가 인증을 통과했다는 사실은 상태값이 아닌가?
그 부분을 지금부터 설명한다.
어떻게 비연결성, 무상태 프로토콜에서 "유저가 인증되었다"라는 정보를 유지시켜야 한다는 과제를 어떻게 해결했는지 관점에서 보면 좋다.
인증의 방식
일반적으로 웹 애플리케이션은 2가지 방법으로 인증을 처리한다.
쿠키-세션 방식의 인증
쿠키-세션 방식은 서버가 '특정 유저가 로그인 되었다'는 상태를 저장하는 방식이다.
인증과 관련된 아주 약간의 정보만 서버가 가지고 있게 되고 유저의 이전 상태의 전부는 아니더라도 인증과 관련된 최소한의 정보는 저장해서 로그인을 유지시킨다는 개념이다.
아래는 그림의 각 번호에 따른 설명이다.
JWT 기반 인증
JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다. JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별한다.
아래는 그림의 각 번호에 따른 설명이다.
'Spring 숙련주차 > 1주차' 카테고리의 다른 글
6. JWT 다루기 (0) | 2024.08.23 |
---|---|
5. JWT란 무엇일까? (0) | 2024.08.22 |
4. 쿠키와 세션이란 무엇일까? (0) | 2024.08.21 |
2. 같은 타입의 Bean이 2개라면? (0) | 2024.08.21 |
1. Bean을 수동으로 등록하는 방법 (0) | 2024.08.19 |