본문 바로가기

CS/Network

Web에서의 인증과 인가(세션과 토큰)

보안에 있어서 인증과 인가는 필수적인 요소로 정보 시스템에서 사용자나 시스템의 접근을 제어하는 중요한 역할을 한다. 인증을 통해 사용자의 신원을 파악하고, 인가 과정을 거침으로서 사용자가 특정 자원이나 기능에 접근할 수 있는 권한을 확인하고 부여한다. 해당 글에서 혼동되기 쉬운 용어인 인증과 인가의 정리와 함께 웹에서는 인증과 인가가 어떠한 방식으로 이뤄지고 있는지 알아보자


인증과 인가

1. 인증(Authentication)

사용자의 신원을 확인하는 절차

인증은 사용자가 자신임을 증명하는 과정이다. 상황에서 예를 찾아보면 주민등록증이 해당한다. 

2. 인가(Authorization)

인증된 사용자가 특정 자원이나 기능에 접근할 수 있는지 확인하는 절차  

인가는 확인된 사용자가 무엇을 할 수 있는지 결정하는 과정이다. 상황에서 예를 찾아보면 출입증이 해당한다.

3. 웹에서 인증과 인가를 구현하기 위한 방법

쿠키

우선 쿠키에 대해 알아보자.

웹 서핑을 하다보면 "모든 쿠키를 허용하시겠습니까" 라는 문구를 종종 볼 수 있다. 웹에 대해 잘 알지 못한다면 여기서 말하는 쿠키가 분명 먹을 것은 아닐테고, 과연 이것이 무엇인지 잘 모를 것이다.

그리고 인터넷 사용 기록을 보기 위해 브라우저의 설정 창에 들어가면 위와 같은 내용을 볼 수 있다.

쿠키는 사용자가 특정 웹 사이트에 방문하기 위해 서버에 요청하고 서버는 사용자에 관한 것들을 저장하기 위해 사용자의 브라우저 안에 데이터를 넣을 수 있다. 이 데이터를 쿠키라고 한다. 그럼 데이터 안의 정보들은 무엇이 있을까? 예를 들어보면 해당 사이트의 언어정보, 최근에 검색한 내용, 상품, ID ,비밀번호 저장 등이 있다.

 

브라우저와 서버 간의 통신 프로토콜 HTTP

브라우저와 서버 간에 통신을 하면서 사용자가 특정 페이지를 요청하였을 때 사용자가 필요한 정보와 브라우저가 저장하고자 하는 데이터가 있다면 쿠키와 함께 정보를 보내게 된다.

 

쿠키

  • 상태 정보를 유지하는 기술
  • 쿠키는 도메인에 따라 제한이 된다.
  • 쿠키는 사용자의 컴퓨터 메모리에 저장
  • 쿠키는 서버가 정한 기간에 따라 유효 기간이 있다.
  • 쿠키는 오직 브라우저만 가지고 있다.
  • ex) 검색기록, 최근 검색 상품, 언어정보

 

세션

 

세션은 웹 서버에 접속한 순간부터 종료할 때까지 서버가 사용자의 정보를 가지고 있어 맞춤 정보를 제공할 수 있도록 하는 기술을 의미한다. 서버는 Stateless, 즉 무상태성을 띄고 있다. Stateless란 사용자가 요청한 내용이 이전에 요청했던 정보와 독립적으로 이루어지도록 하는 특성으로 요청이 끝나면 서버는 사용자의 요청 내용에 대해서 잊게 된다. 어떤 내용의 요청을 했는지 알 수 없게 되는 것이다. 그러다보니 사용자의 입장에서는 자신의 정보를 포함하여 서버에게 알려서 필요한 정보를 받도록 해야한다. 여기서 필요한 알리는 방법 중 하나가 바로 Session이다.

 

 

사용자가 ID와 Password를 입력하고 서버에게 로그인을 요청한다. 서버는 사용자의 정보를 확인 후 올바른 정보라면 Session 데이터베이스에  SID(Session ID)를 생성하고 사용자에게 SID를 쿠키와 함께 넘겨준다. 그러면 브라우저는 해당 정보를 저장하고 SID를 이용하여 앞의 과정을 반복하며 서버와 통신을 하게 된다. 

 

세션

  • 사용자의 정보를 유지하기 위한 수단
  • 세션 데이터베이스 필요
  • 유저가 늘어날수록 데이터베이스는 과부하가 일어날 수 있다.

 

JWT

JWT는 Json Web Token의 줄임말로 Token의 일종이다.

토큰은 서버가 사용자의 ID와 Password를 확인 후 인증 수단으로 문자열로 이루어진 토큰이라는 것을 주게 된다.

https://jwt.io/

위 사진에 보이는 문자열이 JWT이다. 빨간색은 Header영역으로 알고리즘 정보와  토큰 타입을 가지고 있고, 보라색은 Payload 영역으로 사용자에 대한 정보가 포함되어 있고, 파란색은 header, payload에 해당하는 정보와 서명키에 대한 정보를 나타내고 있으며 해당 토큰이 변조되었는지 확인하는 용도로 사용된다. 

 

사용자 로그인 요청 → 사용자 정보 확인 후 토큰을 제공 → 사용자가 다시 요청하면 유효성 체크를 하고 정보 제공

 

Session 기반의 인증방식과의 차이점은 Token방식은 별도의 데이터베이스가 필요하지 않다. 따라서 서버는 유저를 확인하기 위한 과정도 필요없어지게 된다.

 

JWT

  • 토큰을 통한 사용자 인증방식
  • SID보다 훨씬 길다
  • 세션 DB를 가지고 있을 필요 없다.
  • JWT는 암호화되지 않으므로 비밀정보를 넣으면 안된다.
  • JWT는 무결성이 보장된다.
  • 토큰을 임의로 삭제하는 것이 불가능 하기에 토큰 유효기간을 꼭 설정해야한다.

 

Session VS Token

세션

- Session DB 필요

- 세션은 모든 유저의 정보를 가지고 있어 유저의 권한을 통제할 수 있다.

- 사용자의 접속 정보를 파악할 수 있다.

- ex) 로그인된 기기 확인하기, 넷플릭스 계정 생성

 

JWT

- 서버는 오로지 유효한지만 확인하기 때문에 토큰정보를 추적할 수는 없다.

- 토큰을 이용한 다른 사이트의 계정 로그인을 사용하여 이용 가능(구글, 페이스북, 카카오톡 등 사용자 정보를 활용하여 사용 가능)

- DB없이 검증할 수 있다.

- 사용자 정보 노출 가능성 있음

-ex) 코로나 qr코드

 

 

'CS > Network' 카테고리의 다른 글

HTTP와 HTTPS  (0) 2022.09.16
CDN이란 무엇일까?  (0) 2022.09.06
클라이언트의 서비스 요청에 따른 서버의 처리과정  (0) 2022.09.01
TCP와 UDP  (0) 2022.08.24
Proxy 프록시  (0) 2022.05.16