인증 프로세스
- 유저가 계정과 비밀번호로 로그인을 시도
- (서버에서 패스워드 확인 등으로) 인증이 완료되면 클라이언트로 accessToken을 발급
- 이후 요청 시마다 해당 accessToken을 사용하여 인증 절차 생략
인증 authentication
- 방문자가 자신이 회사 건물에 들어갈 수 있는지 확인받는 과정
- 인증된 유저인지 아닌지를 확인하는 작업
- 인증되지 않으면 401 status code를 내려보낸다.
인가 authorization
- (인증된) 방문자가 회사 건물에 방문했을 때, 허가된 공간에만 접근 가능하다.
- 특정 서비스, 페이지에 접근 권한을 부여하는 것을 의미한다.
- 'JWT'를 쓰면 인가가 수월함. 서버가 유저 정보를 갖고 있으므로 데이터에서 유저의 권한 정보도 읽어들이면 됨.
- 인가되지 않으면 403 status code를 내려보낸다.
인증 방식
1. Session/Cookie
- Session/Cookie 방식은 가장 기본적이면서 전통적인 방식이다.
- 사용자의 정보를 서버(세션저장소)에 세션이라고 불리는 사용자의 정보를 저장한다. (statueful)
- 클라이언트에게는 Session ID를 발급하고 클라이언트는 이 정보를 쿠키에 저장한다.
- 이제 매 요청마다 이 Session ID를 함께 보내고, 서버는 세션저장소에서 유저 인증을 수행한다.
- 인증이 성공하면 요청을 핸들러로 보낸다.
- 인증이 실패하면 응답으로 예외를 반환한다.
- Session ID와 같은 인증 기록은 서버 및 클라이언트 측 모두에 유지된다. 주요한 정보가 다 서버 쪽에 남을 수 있다는 것이 큰 장점이기도 하지만, 요청때마다 매번 세션 저장소에 접근하여 확인해야 한다는 것이 단점이 될 수도 있는 방식이다.
cookie란?
stateless한 HTTP 프로토콜 특성 때문에 유저의 정보를 유지할 수 없는 한계를 극복하기 위해 나온 웹 브라우저에 존재하는 작은 텍스트 파일이다. 이 파일은 브라우저가 관리하게 되고 일반적으로 쿠키에는 만료일이 있다. 브라우저는 쿠키를 통해 접속자의 장치를 인식하고, 접속자의 설정과 과거 이용내역에 대한 일부 데이터를 저장한다. key-value 형식으로 저장된다.
2. Basic HTTP Authentication
- HTTP는 다른 인증 프로토콜에 맞추어 확장할 수 있는
Authorization
제어 헤더를 제공한다.
- HTTP Authorization 헤더는 서버의 사용자 에이전트임을 증명하는 자격을 포함하여, 보통 서버에서 401 Unauthorized 상태를 WWW-Authenticate 헤더로 먼저 알려준다.
- 클라이언트는 username과 password 값을
:(콜론)
으로 합친 뒤, 통채로 Base64
인코딩을 통해 credentials 생성하여 서버로 보낸다.
- 서버는 credentials 값을 Base64로 디코딩하여 username과 password를 분리하여 인증한다.
주의할 점은 Base64 인코딩은 암호화나 해싱을 의미하는 것이 아니다. 이 방법은 인증에 대해서 문자를 그대로 보내는 것과 동일하다고 할 수 있기 때문에 반드시 https를 사용해야 한다. 인코딩을 해서 암호처럼 보이지만, 인코딩 디코딩 방식이 정해져있기 때문에 어느 누가 중간에 통신을 탈취하여 해킹할 위험이 존재하는 것이 단점이다.
3. Bearer HTTP Authentication
- 로그인 시 서버로부터 token을 발급받고, 이후 요청 시 Authentication 헤더에 토큰을 실어 보낸다.
- token을 만들 때 JWT 방식으로 생성하는 것이 특징이다.
- 세션 정보가 클라이언트/서버 각각의 저장소에 흩어져있지 않고, 토큰 자체에 내장되어 있다.
- 무상태 HTTP를 유지할 수 있기 때문에 속도도 빠르고 보안도 뛰어나다고 할 수 있다.
Session/Cookie vs Token
- Session/Cookie방식은 sessionId를 매번 세션 저장소에서 찾아야 하는 번거로움이 있지만, token은 해독하여 유효성만 검증하면 된다.
- 여기서 유효성이란 토큰의 만료기간, 토큰 안의 세션정보 등을 확인할 수 있다.
참고 자료
REST Assured Authentication
HTTP 인증