안드로이드 PHP 통신 로그인 세션

조회수 4848회

retrofit1.9로 PHP에 요청하여 로그인을 구현 하고있습니다.

현재 안드로이드 RestAdapter에서 헤더에 실려오는 세션ID를 인터셉터해서 프리퍼런스에 저장하게 되어있습니다.

builder.setRequestInterceptor(new RequestInterceptor() {
            @Override
            public void intercept(RequestFacade request) {

                request.addHeader("Authorization", "auth-value");
                request.addHeader("Accept", "application/json");
            }
        });
        clienteOkHttp.interceptors().add(new AddCookiesInterceptor());
        clienteOkHttp.interceptors().add(new ReceivedCookiesInterceptor());

현재 사용자가 ID,PWD를 입력하여 요청하였을때 그게 일치한다면 인터셉터하고 문제가 없습니다.

근데 일단 요청을하면 PHP단에서는 ID,PWD가 틀리더라도 헤더에 실어 보내고 안드로이드에서는 헤더에 세션ID값이 있으면 무조건 잡아두니 앱을 껏다키면 바로 로그인되어버립니다.

(앱실행시 프리퍼런스에 쿠키가 비어있는지 체크해서 바로 메인으로 넘어갑니다)

그래서 ID와 PWD가 일치하지 않을때 PHP단에서 이렇게 처리해주었습니다.

session_start();
......
....

If(id,pwd가 일치) {
 //세션변수 설정
}
else if {
 //id,pwd 불일치
  $_SESSION = array();
  session_destroy();
}


이렇게하면 헤더에 안 실려올 줄 알았지만 헤더에는 ID값이 실려오니 문제가 됩니다.

1.결과적으로 로그인 실패했을때는 헤더에 세션ID값을 비우고싶습니다.

2.로그인시 ID와 PWD가 일치하다면 세션변수에 ID값을 넣은 후 사용자 정보를 조회할때 세션변수를 이용해 조회하고있습니다. 이렇게 사용자 ID를 실어보내는게 맞는방법인가요 ??

3.중복로그인을 구현하려면 DB에서 추가적으로 사용자세션을 관리해야하는건가요 ?

4.세션이라는것을 웹이아닌 안드로이드단에서는 크게 필요성을 못느꼇는데 ID같이 사용자정보를 클라이언트단에서 가지고있다가 필요할때마다 요청에 실어 보내는것은 보안상 문제가 있지않을까 싶어서 필요 할 것이다라고 느꼇습니다. 제 생각이 맞는가요..??

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 위코드의 답변은 아니고 4번에 대한 답변입니다

    처음 로그인할때만 보낸다해도 패킷을 캡쳐한다면 다 보입니다

    암호화를 해서 보낸다해도 클라이언트에서 키를 가지고 있거나 받기때문에 역시 클라이언트를 조작한다면 복호화해서 볼수있겠죠

    그래서 사실 귀찮게 앱에서는 세션을 사용할 필요가 별로 없습니다. 물론 사용해도 상관은 없지만 신경써야 할게 한두가지가 아닙니다.

    그래서 나온방식이 로그인이 성공하면 토큰을 발급해서 클라에 던져주고

    요청이 올때마다 토큰을 보내서 인증을 하는 방법이 생겼습니다

    그중에도 몇가지 방법이 있는데 제가 추천하고싶은 방식은 JWT라는 방식입니다

    http://bcho.tistory.com/999

    여기 자세히 나와있습니다. 심플하고 간단하게 그려드리면

    이미지

    이런식입니다

    결론은 결국 id와 pw는 보내지만 그냥 암호화해서 보내는거죠

    중요한건 이제 여기에 변조되지않음을 증명하기위해 서버나 클라이언트에서 서명을 하게 해야됩니다

    그런 라이브러리는 많으니 천천히 찾으시면 됩니다

    간단하게 설명한거라서 개념만 이해되실겁니다. 자세한건 더 알아보시는걸 추천드려요

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)