HTTP 로그인 매서드 (보안과 관련해)

Kim Dong Kyun·2022년 12월 13일
1

Today I learned

목록 보기
16/43

1. 인증과 인가

  • 인증 : 인증은 로그인과 같이 사용자를 인증하여 인가된 컨테츠 / 레이어에 들어가도록 허가하는 것.
  • 인가 : 인가는 사용자의 계층을 나눠서 제공하는 정보를 분리하는것. 예를 들어 관리자 / 일반 유저는 접근할 수 있는 레이어가 다르도록 나누는 일. 더 많은 인가를 받은 유저는 더 깊은 레이어, 정보에 접근할 수 있다.

2. 쿠키와 세션?

  • HTTP는 비연결성(클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어 버리는 성질), 비상태성(서버는 특정 클라이언트를 구별할 수 없다)을 가진다.
  • 이에 따라 인증된 사용자와 인증되지 않은 사용자에게 각기 다른 인가를 내리는 것은 특별한 방법이 필요하다.

이에 따라 쿠키, 세션과 같은 개념이 등장한다.

위와 같은 방식으로 동작한다.

  1. 사용자가 로그인 요청을 보냅니다.
  2. 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조해봐야겠죠?
  3. 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 “세션 저장소”에 해당 유저가 로그인 되었다는 정보를 넣습니다.
  4. 세션 저장소에서는 유저의 정보와는 관련 없는 난수인 session-id를 발급합니다.
  5. 서버는 로그인 요청의 응답으로 session-id를 내어줍니다.
  6. 클라이언트는 그 session-id를 쿠키라는 저장소에 보관하고 앞으로의 요청마다 세션아이디를 같이 보냅니다. (주로 HTTP header에 담아서 보냅니다!)
  7. 클라이언트의 요청에서 쿠키를 발견했다면 서버는 세션 저장소에서 쿠키를 검증합니다.
  8. 만약 유저정보를 받아왔다면 이 사용자는 로그인이 되어있는 사용자겠죠?
  9. 이후에는 로그인 된 유저에 따른 응답을 내어줍니다.

3. 쿠키와 세션의 차이점

4. JWT?

JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. 즉 토큰의 한 종류라고 생각하시면 됩니다. 보통 쿠키 저장소에 담겨서 위에서 배운 ‘저장된 쿠키’라고 생각하시면 좋습니다.

왼쪽은 Json형태를 JWT형태로 Encode 한 부분, 오른쪽은 Json 형태의 데이터들.
Header에는 사용하는 알고리즘과 타입, Payload 부분에는 sub:아이디 / name:이름 등이 나온다. Verifiy signature는 인증키이며 보통 암호화되어 사용한다.

5. JWT 기반 인증

위와 같은 방식이며, 순서는 아래와 같다.

  1. 사용자가 로그인 요청을 보냅니다.
  2. 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조해봐야겠죠?
  3. 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 유저의 정보를 JWT로 암호화 해서 내보냅니다
  4. 서버는 로그인 요청의 응답으로 jwt 토큰을 내어줍니다.
  5. 클라이언트는 그 토큰을 저장소에 보관하고 앞으로의 요청마다 토큰을 같이 보냅니다.
  6. 클라이언트의 요청에서 토큰을 발견했다면 서버는 토큰을 검증합니다.
  7. 이후에는 로그인 된 유저에 따른 응답을 내어줍니다.

0개의 댓글