[Web] 인증과 인가 - 쿠키와 세션
인증과 인가
우리가 웹 서비스를 사용하다 보면 흔히 보이는 것이 로그인이다. 로그인을 해야 해당 웹 서비스를 사용 가능한 경우가 많다.
로그인을 만들어둔 이유가 무엇일까? 우리가 허용한 사람들에 한해서만 서비스를 이용할 수 있게 하기 위해서이다.
개발자들은 이러한 일련의 과정을 위해 인증과 인가의 개념을 도입하여 어플리케이션에 도입한다.
인증 (Authentication)
ID와 비밀번호로 로그인 하여 신분증을 받는 과정
인증은 클라이언트가 누구인지를 확인하는 과정이다. 웹 같은 경우에는 보통 아이디와 비밀번호, 혹은 그 외의 사용자에게 요구하는 정보를 통해 인증 과정을 거치며, 사용자가 아니더라도 어떠한 장치나 클라이언트 프로그램을 Key 등을 이용하여 사용자 주체를 판단하는 과정을 통틀어서 인증이라고 부른다.
인가 (Authorization)
사용자의 신분증을 보고 서비스를 해당 사용자에게 제공해도 되는지를 판단하는 과정
클라이언트를 인증으로 얻은 신분증을 확인하여, 요청한 작업이 해당 클라이언트에게 허용된 작업인지를 확인한다. 해당 인가 과정을 통과한 이후 자원에 대한 접근을 허용한다.
인증을 완료하였다고 모든 곳의 인가가 처리되는 것은 아니다.
여러분이 대한민국에서 신분증을 발급받았다. 그리고 선술집, 동사무소, 은행, 해외 등에서는 여러분의 신분증을 확인하고 신원 확인 후 그 기관을 이용할 수 있게 하는 인가 담당 사람이 있다.
선술집에서는 신분증에서 19세 이상이어야 음식과 술을 제공할 것이고, 동사무소, 은행 등에서 청년혜택을 받기 위해서는 나이를 볼 것이며, 해외에서는 신분증의 출처가 다르므로 허용하지 않는 곳이 있을 수 있다.
사용자가 웹에서 게시판을 조회하기 위해 API 요청을 한다면, 서버는 응답을 제공하기 이전에 인가 작업을 거쳐, 해당 사용자의 인증 정보를 바탕으로, 회원가입된 유저인가? 조회 가능한 회원 등급인가? 등을 판단하여 통과 시 사용자는 요청에 대한 응답을 얻어 비로소 게시판을 조회할 수 있게 된다.
HTTP 통신에서의 인증과 인가
HTTP는 요청과 응답의 방식으로 이루어진다. 요청에 대한 응답의 결과는 저장되지 않는 성질이 있다.
즉, 인증 과정을 거쳐 응답으로 인증 완료가 되었더라도, 서버와 클라이언트는 독립적이고, 이전의 인증 정보가 저장되지 않았기 때문에, 다음 요청에서는 인증 정보를 이용할 수 없다.
HTTP 요청에서는 상태정보를 유지할 수 없으므로 다른 방식의 도움을 받아 인증과 인가 처리를 해야 한다.
아래에서 설명할 오랫동안 사용해왔던 쿠키와 세션 기반 인증 방식이나, 토큰 기반 인증 방식, 다른 믿을만한 곳의 인증 정보를 사용하는 OAuth 인증 방식 등이 있다.
쿠키
- 클라이언트 컴퓨터 브라우저상에 저장되는 데이터이다.
- 이를 통해여 로그인 정보나 장바구니, 광고 보지 않음 옵션 등의 데이터를 쿠키에 저장하여 활용할 수 있다.
- 로그인 과정에서 서버는 쿠키를 이용하여 클라이언트의 인증정보를 유지시킬 수 있다.
- 그렇지만 민감한 데이터를 포함하여 쿠키를 사용한다면, 보안상의 이슈가 발생할 수 있다.
세션
- 정보를 사용자 브라우저에 저장하는 쿠키와는 달리 세션은 서버에 저장한다.
- 세션은 세션 ID를 가지고 있으며 클라이언트상의 쿠키에는 모든 인증정보가 아닌 세션 ID를 포함한 일부만을 저장시킨다.
- 클라이언트는 세션 ID를 포함시킨 쿠키를 요청과 함께 전달하고, 서버는 해당 세션ID로 인증 정보를 찾아 인가한다.
쿠키 & 세션 방식의 한계
- 웹 Application 서버측에 저장한다는 것은 서버 메모리에 인증 정보를 저장한다는 것.
- 세션은 사용자의 인증 정보를 서버에 저장한다. 서버의 과부하 유발.
- 특히 동시 사용자가 많아질수록 서버의 메모리를 비례하여 사용하게 된다.
다음 포스팅에서는 쿠키와 세션의 한계를 보완하는 방법들에 대해서 작성해보겠다.
'WEB > CS' 카테고리의 다른 글
[Web] 인증과 인가 - JWT Auth (1) | 2023.03.02 |
---|---|
[Web] 인증과 인가 - 분산 서버에서의 세션 인증 (0) | 2023.03.02 |
[WEB] CORS(Cross-Origin Resource Sharing) (0) | 2023.01.18 |