Spring/security

[시큐리티] 토큰

라임온조 2023. 3. 29. 10:49

1. 개념

클라이언트가 애플리케이션의 자원에 접근할 수 있도록 해 주는 일종의 출입카드. 이것이 있어야 원하는 자원(엔드포인트)에 접근해서 자원을 얻을 수 있다. 서버가 클라이언트의 인증을 확인하는 방법 중 하나. 

 

2. 작동

  • 클라이언트가 본인의 아이디와 비밀번호를 서버에게 보내면서 나는 올바른 회원이니 토큰(출입카드)를 달라고 요청한다. 
  • 서버는 이 요청을 보고 저 회원이 올바른 회원인지 확인한 후, 올바른 회원이면 토큰을 주고 올바르지 않은 회원이면 토큰을 주지 않는다. 이때, 토큰을 준다면 건네준 토큰을 서버는 어딘가에 저장해 놓는다. 나중에 클라이언트가 토큰을 보냈을 때 올바른 토큰인지 검사가 필요하기 때문에.
  • 클라이언트는 아까 받은 토큰을 가지고 있다가, 엔드포인트를 호출할 때(api를 호출해서 자원 얻으려고 할 때) http 헤더에 그 토큰을 넣고 서버에게 요청한다.
  • 서버는 클라이언트가 보낸 토큰과 아까 저장해 놓은 토큰이 일치하는지 확인한 후 일치하면 리소스를 건네준다.

 

3. 장점

1) 토큰을 이용하면 요청할 때마다 자격 증명을 공유할 필요가 없다.

토큰을 이용하지 않을 때 http basic 방식을 사용했다. 이 방식에서는 엔드포인트를 호출할 때마다 자격증명(아이디와 비밀번호)을 계속 같이 보냈다. 로그인 엔드포인트에도 자격증명을 보내고, 글 조회 엔드포인트에도 자격증명을 보내고. 이러다보면 자격 증명이 계속 노출되기 때문에 가로챔 당할 위험이 커진다.

하지만 토큰을 이용하면 맨 처음 로그인 할 때만 자격증명을 보내면 되고, 그 이후 엔드포인트 호출 때는 자격증명을 보낼 필요가 없이 토큰만 보내면 된다. 그래서 자격증명이 탈취당할 위험이 적어진다.

2) 토큰의 수명을 짧게 지정하여 악의적인 토큰 탈취에 대비할 수 있다.

서버에게서 받은 토큰의 수명은 지정이 가능하다. 그렇기 때문에 토큰이 탈취당해도 수명이 지나면 사용이 불가능해서 안전하다.

3) 토큰은 요청에 필요한 세부 정보를 저장할 수 있다.

토큰 자체에 사용자의 권한과 역할 같은 세부 정보를 함께 넣어 클라이언트에게 전달할 수 있다. 

4) 토큰을 이용하면 인증 책임을 시스템의 다른 구성 요소로 분리할 수 있다.

사용자의 인증을 다른 애플리케이션을 이용해서 진행할 수 있어서 사용자를 직접 관리하는 시스템을 구현하지 않아도 된다. 이를 통해 애플리케이션의 유연성이 향상될 수 있고, 다른 부분에 더 집중할 수도 있다.

 

4. JSON 웹 토큰

1) 개념

결론적으로는 토큰이다. 그래서 위에서 설명한 것처럼 서버에 자원을 요청하기 위해 사용된다. 그런데 이 토큰이 포함하는 데이터의 형식이 JSON이며, 웹 요청을 위해 설계된 토큰을 의미한다.

2) 구성

헤더(Header) - 위 사진에서 x

  • 인코딩 전 데이터 형식이 JSON 형식이다
  • Base64로 인코딩 된다
  • 토큰과 관련된 메타데이터를 저장한다. 보통, 헤더에 서명을 생성하는 데 이용한 알고리즘의 이름을 저장한다.

본문(Payload) - 위 사진에서 y

  • 인코딩 전 데이터 형식이 JSON 형식이다
  • Base64로 인코딩 된다
  • 나중에 권한 부여에 필요한 세부 정보(역할 이름, 사용자 이름)를 저장한다

디지털 서명(Signature) - 위 사진에서 z

  • Base64로 인코딩된 헤더와 Base64로 인코딩된 본문을 헤더에 명시된 알고리즘으로 서버의 개인키를 사용해서 서명한다
  • 개인키는 서버만 알고 있기 때문에, 토큰이 서버에서 생성된 것이 맞는지 증명하는데 사용된다.

 

 

 

 

'Spring > security' 카테고리의 다른 글

[시큐리티] OAuth2 - 승인 코드 그랜트 유형 깃허브로 연습  (0) 2023.03.31
[시큐리티] OAuth 2  (0) 2023.03.30
[시큐리티] CORS  (0) 2023.03.28
[시큐리티] CSRF  (0) 2023.03.27
[시큐리티] 필터  (0) 2023.03.23