인증과 인가

  • 인증(Authentication): 사용자가 누구인지 식별하는 과정
  • 인가(Authorization): 사용자의 접근 권한을 확인하는 과정

대부분의 웹사이트가 인증과 인가를 함께 실행한다.

구현 방법

WEB 서비스들은 HTTP 프로토콜을 사용해 통신하는데 HTTP의 stateless 특징 때문에 한 번 인증을 진행하더라도 클라이언트가 다른 요청을 보낼 경우 서버는 이 요청을 보낸 클라이언트가 인증된 클라이언트인지 알 수 없다.
다음 세 가지 방법 중 하나를 사용하면 해결할 수 있다.

쿠키(http cookie, web cookie, browser cookie)는 서버가 클라이언트(웹 브라우저)에게 보내는 작은 데이터(key-value 형태)이다. 쿠키를 받은 웹 브라우저는 쿠키를 저장하고 있다가 해당 서버에 요청을 보낼때 쿠키를 함께 보낸다.
일반적으로 쿠키는 특정 요청이 동일한 웹 브라우저로부터 왔음을 알리기 위해 사용된다.

Cookie에 다음과 같은 정보를 포함하여 인증을 구현할 수 있다.

  • IDPW: 사용자의 id, pw
  • path: 브라우저가 같은 도메인에 요청을 보낼때 쿠키를 보낼 경로. (“/”로 설정하면 해당 도메인의 모든 경로로 보내는 요청에 쿠키가 포함된다.)
  • maxAge: 쿠키의 유효기간을 표현한다. 단위는 초(sec)이다. (60*60으로 설정하면 1시간동안 유효하다.)
  • addCookie: response에 생성한 쿠키를 추가한다.
  • HttpOnly: true인 경우 JavaScript로 쿠키에 접근하는 것을 막아준다.

브라우저에 저장된 쿠키는 Chrome 기준으로 오른쪽 마우스 클릭 -> 검사 -> Application -> Storages -> Cookies에서 볼 수 있다.

Session

세션이란 간단히 말하면 서버와 클라이언트 사이의 논리적인 연결이다.
예를 들어 회원A와 회원B가 각각 웹사이트X에 로그인하면 세션 AX, AB가 형성된다. (논리적인 연결이기 때문에 실재하는 것은 아니다.)

Session ID를 사용해 구현

최초 로그인 이후 서버로 요청을 보낼 때마다 사용자의 ID/PW를 전송하는 것은 보안상의 문제가 발생할수 있다. 이를 해결하기 위해 회원(session)을 식별할 수 있는 값(session id)만을 Cookie로 주고받는다.

session id 방식

최초 로그인이 진행될때 서버는 해당 회원에 대한 session id를 생성하고 session storage에 저장한다.
이후에 해당 회원이 쿠키와 함께 요청을 보낼 경우 쿠키에 포함된 session id를 session storage에서 조회하여 인증/인가를 진행한다.
요청을 받을 때마다 데이터를 조회하는 과정이 추가되기 때문에 접속자가 많은 경우 성능 저하의 요인이 된다.

  • session storage가 서버 내부에 있는 경우 Tomcat에는 session id를 관리하는 기능이 있다. 서버 인스턴스가 1개 이상일 경우 session id가 저장되지 않은 서버로 요청이 전송되는 경우에 대비해야 한다.
  • session storage가 서버 외부에 있는 경우 저장소가 감당해야할 부하를 고려해야 한다.

Cookie에 로그인 정보를 담지 않았다는 점에서 안전하지만 서버가 상태를 저장한다는 점에서 REST와는 거리가 멀다.

Token

Session ID 방식의 단점(상태를 저장한다는 점과 storage에 의존한다는 점)을 해결하기 위한 방법이다.
사용자를 식별할 수 있는 정보가 담긴 암호화된 문자열(Token)을 생성하여 사용자(웹 브라우저)에게 전달하면 이후 웹 브라우저는 해당 서버로 요청을 보낼때 Token을 같이 보낸다. 서버는 요청을 받을때마다 Token을 해석하여 사용자를 식별한다.

JWT(JSON Web Token)

웹 서비스에서 인증을 위해 사용되는 토큰 중 하나이다. 여기에서 JWT를 생성해볼수 있다.

  • Header: Token 유형, 서명 알고리즘(SHA-256 또는 RSA 등)을 명시
    🚨 서명 알고리즘을 none으로 설정하지 않도록 주의해야 한다.
  • Payload: 전송하고자 하는 데이터
  • Signiture: Base64로 인코딩된 Header, Payload와 서버가 가지고 있는 비밀 키가 지정된 알고리즘으로 암호화된 값

위의 세 가지 데이터는 “.”으로 구분된다.

JWT에 대한 자세한 내용

references

Tags:

Categories:

Updated:

Comments