본문 바로가기
Security

인증 / 인가

by eoruadl 2023. 2. 20.

웹서비스를 만들기 위해 필수적으로 알아야할 지식이 인증 / 인가 이다.

대부분의 서비스에서는 로그인이 필수적이기 때문이다.

 

인증 / 인가 란?

인증(Authentication) 이란 웹사이트를 이용하는 사용자의 신원을 확인하는 것이다. 가장 간단한 예로 ID와 PW를 이용하여 로그인을 하는 것을 인증이라 할 수 있다.

 

인가(Authorization) 란 인증을 완료한 사용자가 어떠한 페이지 (서비스)에 접근할 권한이 있는지 확인하는 것을 인가라고 한다.

간단한 예로 관리자 페이지에는 일반적인 사용자가 접근할 수 없다. 일반적인 사용자에게는 관리자 페이지에 대한 인가가 없기 때문이다.

 

각각의 프로세스를 살펴보자

 

인증

  1. 로그인 요청 : 사용자(클라이언트)가 아이디와 비밀번호를 입력하고 로그인 요청
  2. 사용자 확인 : DB를 확인하여 사용자의 아이디와 비밀번호가 일치하는지 확인하여 인증 여부 결정
  3. 토큰 발급 : 사용자 정보가 일치하면 일종의 출입증인 토큰을 발급하여 응답과 함께 전송
  4. 상태 유지 : 사용자는 받은 토큰을 다음 요청을 할 때 같이 서버에 보내 상태를 유지

인가

  1. 데이터 요청 : 사용자는 관리자 페이지에 접근하기 위해 서버에 페이지 요청과 토큰 전송
  2. 토큰 검증 : 서버는 토큰을 확인하여 사용자를 확인한 후 DB에서 사용자가 관리자 페이지에 접근할 권한이 있는지 확인
  3. 인가 처리 : 사용자의 권한이 확인되면, 요청 처리

위 프로세스는 토큰을 이용한 방식인데 이러한 토큰을 사용한 이유를 알기위해 HTTP의 stateless한 특성을 이해해야한다.

 

웹 사이트는 HTTP 통신으로 동작한다. 웹 사이트 내의 모든 요청과 응답은 stateless한 특성을 가진다. 즉, 서버가 클라이언트의 이전 상태를 기억하지 않는다는 의미이다.

 

이러한 점을 인증과 함께 생각해보면 사용자가 로그인을 통해 인증을 하더라도 이후에 요청을 할 때는 인증된 상태를 유지하지 않게 된다.

이러한 상황에서 웹사이트를 이용하면 매번 요청을 할 때마다 로그인을 해줘야하는 번거로운 상황이 발생하게 될 것이다.

 

이러한 점을 해결하기 위해 탄생한 것이 쿠키, 세션, 토큰이다.

 

먼저 쿠키와 세션을 알아보자.

 

쿠키와 세션의 공통점은 클라이언트의 정보를 연속적으로 유지하기 위해 존재한다는점이 공통점이다.

차이점은 상태 정보의 저장 위치에 있다.

 

쿠키는 클라이언트에 상태 정보를 저장하고, 세션은 서버에 저장한다.

각각 장단점이 있기 때문에 적절한 상황에 맞게 사용해야 한다.

 

쿠키 (Cookie)

사용자에 웹 사이트에 접속할 때, 사용자의 PC에 저장하는 작은 정보 파일이다.

사용자의 ID와 PW가 자동으로 입력되게 하거나, 팝업창의 '다시보지 않기' 를 클릭하는 것 등이 쿠키를 활용한 사례이다.

첫 방문 시 사용했던 ID와 PW, '다시보지 않기' 를 클릭한 정보 등을 사용자의 PC에 저장해놓고 재방문 시 서버는 쿠키 정보를 바탕으로 ID, PW가 입력되어 있는 웹사이트, 팝업창이 생략된 웹사이트를 사용자에게 제공한다.

 

쿠키는 사용자의 PC에 저장되기 때문에 접근 속도가 빠르고, 서버에 부담을 덜어준다.

하지만 보안 측면에서 볼 때 사용자의 PC에 저장되어 해킹의 위험이 있고, 브라우저가 종료되어도 자동으로 삭제되지 않기 때문에 위험하다.

때문에 중요하고 민감한 정보들은 쿠키에 저장하지 않는다.

 

세션 (Session)

세션은 일정 기간 동안 사용자의 상태를 일정하게 유지하는 기술이다.

여기서 '일정 기간' 이란, 로그인 ~ 로그아웃, 로그인 ~ 브라우저 종료 시점까지를 의미

브라우저 하나당 하나의 세션이 생성되고, 해당 브라우저에서 들어오는 요청들은 모두 동일한 세션 id로 식별하여 처리한다.

로그인 후 다른 페이지로 이동해도 로그아웃이 되지 않고 로그인이 유지되는 이유가 세션 덕분이다.

 

세션은 서버에 저장하여 관리하기 때문에 상대적으로 안정된 상태를 유지할 수 있고, 브라우저를 종료하면 세션이 자동적으로 삭제되기 때문에 보안상으로도 유리하다.

하지만 세션은 서버에 저장되기 때문에 사용자들이 많아지면 서버에 과부하가 걸리게 되며 속도가 느려진다는 단점이 있다.

 

세션은 쿠키와 함께 사용한다. 프로세스를 살펴보면

  1. 사용자가 서버에 웹페이지 요청을 할 때, 쿠키 정보를 함께 보낸다.
  2. 서버는 사용자가 전달한 쿠키 안에 세션 id가 있는지 확인한다.
  3. 세션 id가 존재하면 상태를 유지하고, 세션 id가 존재하지 않으면 DB에 세션 id를 새로 생성하여 저장한다.
  4. 그리고 사용자에게 응답을 할 때 세션 id를 저장한 쿠키를 보내준다.
  5. 이 쿠키는 요청한 사용자의 PC에 저장된다.
  6. 사용자가 다른 요청을 보낼 때 세션 id가 포함된 쿠키를 같이 보내며서버는 세션 id를 이용하여 사용자를 식별하여 사용자의 상태를 처리한다.

로그인을 할 때 쿠키 / 세션을 이용하면 해커가 쿠키를 가로채서 치명적인 보안 문제를 일으킬 수 있다.

그리고 서버에 수많은 세션 정보들이 저장되고 이러한 정보들을 확인하게 되면 서버에 부담이 커질수 있다.

 

이러한 문제점을 해결하기 위해 등장한 것이 토큰(Token) 이다.

 

토큰 (Token)

토큰은 사용자의 인증 정보를 암호화 시킨 것으로, 일종의 '출입증' 역할을 한다.

사용자가 최초 로그인 시 토큰을 발급해주고, 이후 사용자는 이 토큰을 가지고 다른 페이지에 접속 할 수 있게 된다.

 

토큰의 인가 프로세스를 살펴보자

  1. 사용자가 로그인 시, 서버는 토큰을 발급해준다.
  2. 사용자는 발급된 토큰을 PC에 저장
  3. 사용자는 이 후 다른 요청을 보낼 때 토큰과 같이 서버로 보낸다.
  4. 서버는 사용자의 토큰 정보를 검증한 뒤(복호화 등), 사용자의 권한을 확인하고 인가 요청을 처리해준다.

이렇게 토큰은 세션과 달리 사용자의 PC에 저장된다.

서버에 유저 정보를 저장할 필요가 없고, 서버는 토큰에 대한 검증(암호화된 토큰 복호화) 과정만 수행하면 되기 때문에 서버에 부담이 적다.

 

토큰도 HTTP 통신을 하며 해킹을 당할 위험이 존재한다.

그래서 보안 피해를 최소화하기 위해 서버는 2가지 종류의 토큰을 사용자에게 발급한다.

 

하나는 'Access Token'이고 둘은 Access Token이 만료되었을 때 인증 상태를 연장시켜줄 'Refresh Token' 이다.

보통 보안을 위해 Access Token의 유효기간을 짧게 설정하고, Refresh Token은 보다 길게 설정한다.

 

사용자는 Access Token을 이용해 서버와 정보를 주고 받다가 Access Token이 만료되면 Refresh Token을 함께 보내 새로운 Access Token을 발급받게 된다.

Refresh Token은 Access Token이 만료되었을 때에만 노출이 되기 때문에 해킹 당할 위험이 적다.

 

[참고]

https://enjoyinjoanne.tistory.com/67

 

[IT교양] 비전공자를 위한 인증/인가이해하기 (HTTP통신, 쿠키, 세션, 토큰)

비개발자로써 개발자와 밀접하게 일을 하다 보면, 다양한 IT용어를 마주하게 됩니다. 이게 뭔지 알아보자!하고 패기 넘치게 검색을 해보면, 그 어려운 말을 설명하는 말에 또 다른 어려운 말이

enjoyinjoanne.tistory.com

https://dev.gmarket.com/45

 

인증/인가는 어디에 어떻게 구현해야 할까?

안녕하세요 Post-tx & Accounting팀 권우석입니다. 최근 온보딩 프로젝트를 함께했던 Shopping Service API팀의 김도훈님의 제안으로 회원가입/로그인 API를 간단하게 구현하는 토이 프로젝트를 진행하고

dev.gmarket.com

 

'Security' 카테고리의 다른 글

OAuth 2.0 이란?  (0) 2023.02.22

댓글