1. 인증과 인가
- 인증 : 인증은 로그인과 같이 사용자를 인증하여 인가된 컨테츠 / 레이어에 들어가도록 허가하는 것.
- 인가 : 인가는 사용자의 계층을 나눠서 제공하는 정보를 분리하는것. 예를 들어 관리자 / 일반 유저는 접근할 수 있는 레이어가 다르도록 나누는 일. 더 많은 인가를 받은 유저는 더 깊은 레이어, 정보에 접근할 수 있다.
2. 쿠키와 세션?
- HTTP는 비연결성(클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어 버리는 성질), 비상태성(서버는 특정 클라이언트를 구별할 수 없다)을 가진다.
- 이에 따라 인증된 사용자와 인증되지 않은 사용자에게 각기 다른 인가를 내리는 것은 특별한 방법이 필요하다.
이에 따라 쿠키, 세션과 같은 개념이 등장한다.
위와 같은 방식으로 동작한다.
- 사용자가 로그인 요청을 보냅니다.
- 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조해봐야겠죠?
- 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 “세션 저장소”에 해당 유저가 로그인 되었다는 정보를 넣습니다.
- 세션 저장소에서는 유저의 정보와는 관련 없는 난수인 session-id를 발급합니다.
- 서버는 로그인 요청의 응답으로 session-id를 내어줍니다.
- 클라이언트는 그 session-id를 쿠키라는 저장소에 보관하고 앞으로의 요청마다 세션아이디를 같이 보냅니다. (주로 HTTP header에 담아서 보냅니다!)
- 클라이언트의 요청에서 쿠키를 발견했다면 서버는 세션 저장소에서 쿠키를 검증합니다.
- 만약 유저정보를 받아왔다면 이 사용자는 로그인이 되어있는 사용자겠죠?
- 이후에는 로그인 된 유저에 따른 응답을 내어줍니다.
3. 쿠키와 세션의 차이점
4. JWT?
JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉 토큰의 한 종류라고 생각하시면 됩니다. 보통 쿠키 저장소에 담겨서 위에서 배운 ‘저장된 쿠키’라고 생각하시면 좋습니다.
왼쪽은 Json형태를 JWT형태로 Encode 한 부분, 오른쪽은 Json 형태의 데이터들.
Header에는 사용하는 알고리즘과 타입, Payload 부분에는 sub:아이디 / name:이름 등이 나온다. Verifiy signature는 인증키이며 보통 암호화되어 사용한다.
5. JWT 기반 인증
위와 같은 방식이며, 순서는 아래와 같다.
- 사용자가 로그인 요청을 보냅니다.
- 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조해봐야겠죠?
- 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 유저의 정보를 JWT로 암호화 해서 내보냅니다
- 서버는 로그인 요청의 응답으로 jwt 토큰을 내어줍니다.
- 클라이언트는 그 토큰을 저장소에 보관하고 앞으로의 요청마다 토큰을 같이 보냅니다.
- 클라이언트의 요청에서 토큰을 발견했다면 서버는 토큰을 검증합니다.
- 이후에는 로그인 된 유저에 따른 응답을 내어줍니다.